asp.net отправляет список <> элементов контроллеру - PullRequest
0 голосов
/ 05 марта 2012

У меня есть следующая форма:

 <li>
                                    <% using (Html.BeginForm("TestMethod", "MyController", FormMethod.Post, new {id = "TestMethod"}))
                                       {%>
                                           <%= Html.Hidden("model", Model.MyListOfObjects) %>

                                     <%}%>
                                      <a href="#" onclick="SubmitForm()">Test</a>
                                   </li>

И функция JavaScript для onclick выглядит следующим образом:

   function SubmitForm() {
  document.forms["TestMethod"].submit();
 }

Я пытаюсь передать список объектов из представления в контроллер, но мне все же удалось заставить это работать. Моя функция контроллера:

 [Authorize]
    [HttpPost]
    public ActionResult TestMethod(List<Objects> model)
    {
        dynamic Expando = new ExpandoObject();
        Expando.test = model; 
        return View(Expando );
    }

Когда я просматриваю Список объектов в отладчике, он всегда отображает «System.Collections.Generic.List`1 []» без реальных объектов внутри.

Итак, мой вопрос: что мне делать, чтобы передать список объектов в контроллер?

Я также пробовал:

 <% using (Html.BeginForm("TestMethod", "MyWork", FormMethod.Post, new {id = "TestMethod"}))
                                       {%>
                                       <% int itemx = 0; %>
                                       <% foreach (var x in Model.MyListOfObjects)
                                          {%>
                                            <%= Html.Hidden("model"+"["+itemx+"]", x) %>
                                            <%itemx++; %>
                                          <% } %>


                                     <%}%>

Ответы [ 2 ]

1 голос
/ 05 марта 2012

Нельзя просто указать List<object> в качестве параметра действия и ожидать, что механизм связывания модели сможет автоматически угадать , какие типы объектов вы хотите поместить туда.Вам нужно будет написать пользовательский механизм связывания модели, если вы хотите обрабатывать несколько подтипов, как показано в этом сообщении .

И если вы хотите использовать один тип для списка, такой какList<MyViewModel> затем просто переберите каждый элемент списка (соблюдая соглашение ) и для каждого элемента создайте скрытое поле для каждого свойства, которое вы хотите связать.

Но так как этоскрытые поля, я думаю, что пользователь не должен изменять их.В этом случае эти скрытые поля не имеют ничего общего с вашей точки зрения.Давайте не будем изобретать ViewState, от которого мы все были так рады избавиться, когда мы перешли на ASP.NET MVC из классических веб-форм.Просто поместите скрытое поле, содержащее уникальный идентификатор, который позволит вам повторно получить соответствующие элементы списка в действии POST с данным уникальным идентификатором из того места, где вы их изначально извлекли (ваша база данных или что-то, я полагаю).

0 голосов
/ 05 марта 2012

Вам необходимо иметь один скрытый элемент для каждого объекта в списке с именем model[0], model[1] и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...