asp.net发送一个List<>项目到控制器

时间:2012-03-05 17:01:48

标签: asp.net-mvc

我有以下表格:

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

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

onclick的javascript函数如下:

   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 个答案:

答案 0 :(得分:1)

您不能只将List<object>作为操作参数,并期望模型绑定器能够自动猜测您希望放置哪些对象类型。如果要处理多个子类型,则需要编写自定义模型绑定器,如this post中所示。

如果你想为列表使用单一类型,例如List<MyViewModel>,那么只需遍历列表中的每个元素(尊重the convention),并为每个元素为每个属性构建一个隐藏字段你想要绑定。

但是因为那些是隐藏的字段,我想用户不应该修改它们。在这种情况下,这些隐藏字段在您的视图中无关。让我们不重新发明ViewState,当我们从经典的WebForms迁移到ASP.NET MVC时,我们都很高兴摆脱它们。简单地放一个包含唯一id的隐藏字段,这个字段允许你在POST操作中重新获取相应的列表元素,只要你从最初获取它们的地方(你想要的数据库或其他东西)获得这个唯一的id。

答案 1 :(得分:0)

您需要为列表中的每个对象设置一个隐藏元素,并命名为model[0]model[1]等。