Codes DeCodes Ответов: 1

Циклический список объектов внутри частичного представления возвращающий нулевые значения в post


У меня есть частичное представление, внутри которого зацикливается мой объект доступности для получения значений из текстового поля. Я добавил сюда свой код.

Мой класс моделей:
public class Availability
   {
       public int ID { get; set; }
       public string Name{ get; set; }
       public string Address { get; set; }
       public string Gender { get; set; }
       public int Adult { get; set; }
       public int Child { get; set; }
   }


Мой контроллер:
public class HomeController : Controller
  {
      List<Availability> lst = new List<Availability>();

      public ActionResult Index()
      {
          Availability aa = new Availability();
          Availability a1 = new Availability();
          Availability a2 = new Availability();
          Availability a3 = new Availability();
          lst.Add(aa);
          lst.Add(a1);
          lst.Add(a2);
          lst.Add(a3);

          return View(lst);
      }
      public ActionResult ListOfPost(List<WebApplication1.Class.Availability> aaa)
      {

          return View();
      }
  }


Мой основной вид:

@model IEnumerable<WebApplication1.Class.Availability>
@{
    ViewBag.Title = "Home Page";
}

My partail view:
<script type="text/javascript" src="http://code.jquery.com/jquery-3.3.1.js"></script>
    Index page
@Html.Partial("_Availability", Model)


@model IEnumerable<WebApplication1.Class.Availability>

<p>
    @Html.ActionLink("Create New", "Create")
</p>
@using (Html.BeginForm("ListOfPost", "Home", FormMethod.Post))
{

    <table class="table">
        <tr>
            <th>
                @Html.DisplayNameFor(model => model.Name)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Address)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Gender)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Adult)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Child)
            </th>
        </tr>

        @foreach (var item in Model)
        {
            <tr>
                <td>
                    @Html.TextBoxFor(modelItem => item.Name, new { @class = "Name" })
                </td>
                <td>
                    @Html.TextBoxFor(modelItem => item.Address, new { @class = "Address" })
                </td>
                <td>
                    @Html.TextBoxFor(modelItem => item.Gender, new { @class = "Gender" })
                </td>
                <td>
                    @Html.TextBoxFor(modelItem => item.Adult, new { @class = "Adult" })
                </td>
                <td>
                    @Html.TextBoxFor(modelItem => item.Child, new { @class = "Child" })
                </td>
            </tr>
        }

    </table> 
    <input id="btnSubmit" class="btn btn-default" type="submit" value="Submit">
}


Моя ошибка заключается в том, что когда я нажимаю кнопку submit to post data to ListOfPost() ActionResult, параметр aaa возвращает нулевое значение. Я сомневаюсь, что причиной проблемы является имя, которое будет сохранено для всего текстового поля.

Как я могу получить введенные пользователем значения в post???

Что я уже пробовал:

Чтобы отличить имя, я использовал приведенный ниже код.

@{int i = 0;      }
  @foreach (var item in Model)
  {
      <tr>
          <td>
              @Html.TextBoxFor(modelItem => item.Name, new { Name = item.Name + i, id = item.Name + i })
          </td>
          <td>
              @Html.TextBoxFor(modelItem => item.Address, new { Name = item.Address + i, id = item.Address + i })
          </td>
          <td>
              @Html.TextBoxFor(modelItem => item.Gender, new { Name = item.Gender + i, id = item.Gender + i })
          </td>
          <td>
              @Html.TextBoxFor(modelItem => item.Adult, new { Name = item.Adult + i, id = item.Adult + i })
          </td>
          <td>
              @Html.TextBoxFor(modelItem => item.Child, new { Name = item.Child + i, id = item.Child + i })
          </td>
      </tr>
      @{  i += 1; }*@

1 Ответов

Рейтинг:
7

F-ES Sitecore

Вы не можете использовать "foreach" в представлении таким образом, вместо этого используйте цикл "for"

бритва - ASP.NET в MVC 4 на цикл постов свойства модели коллекции, но foreach не - переполнение стека[^]

Ваша модель на частичном представлении является IEnumerable, которая не поддерживает то, что вам нужно. Измените его на

@model List<WebApplication1.Class.Availability>


Теперь измените форму на

@for (int i=0; i < Model.Count; i++)
{
    <tr>
        <td>
            @Html.TextBoxFor(modelItem => Model[i].Name, new { @class = "Name" })
        </td>
        <td>
            @Html.TextBoxFor(modelItem => Model[i].Address, new { @class = "Address" })
        </td>
        <td>
            @Html.TextBoxFor(modelItem => Model[i].Gender, new { @class = "Gender" })
        </td>
        <td>
            @Html.TextBoxFor(modelItem => Model[i].Adult, new { @class = "Adult" })
        </td>
        <td>
            @Html.TextBoxFor(modelItem => Model[i].Child, new { @class = "Child" })
        </td>
    </tr>
}


У вас также есть проблема с вашими заголовками. Пока в коллекции моделей есть хотя бы один элемент вы можете это сделать

<tr>
    <th>
        @Html.DisplayNameFor(model => model.First().Name)
    </th>
    <th>
        @Html.DisplayNameFor(model => model.First().Address)
    </th>
    <th>
        @Html.DisplayNameFor(model => model.First().Gender)
    </th>
    <th>
        @Html.DisplayNameFor(model => model.First().Adult)
    </th>
    <th>
        @Html.DisplayNameFor(model => model.First().Child)
    </th>
</tr>


Однако если вы не можете гарантировать, что будет хотя бы один элемент, вам следует найти другой способ передачи заголовков полей в представление.


Codes DeCodes

Я использовал это, как показано в ссылке.. Все еще получаю ноль.
Пожалуйста, дайте мне знать, если я делаю какую-то ошибку.

@for (var i = 0; i < Model.Count(); i++)
{
@Html.TextBoxFor(m => Model.ElementAt(i).Name) @Html.TextBoxFor(m => Model.ElementAt(я).Адрес) @Html.TextBoxFor(m => Model.ElementAt(i).Gender) @Html.TextBoxFor(m => Model.ElementAt(я).Взрослый) @Html.TextBoxFor(m => модель.ElementAt(я).Ребенок)

}

F-ES Sitecore

Я обновил свое решение

Codes DeCodes

Именно этого я и хотел. Спасибо...