我有以下表格:
<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++; %>
<% } %>
<%}%>
答案 0 :(得分:1)
您不能只将List<object>
作为操作参数,并期望模型绑定器能够自动猜测您希望放置哪些对象类型。如果要处理多个子类型,则需要编写自定义模型绑定器,如this post中所示。
如果你想为列表使用单一类型,例如List<MyViewModel>
,那么只需遍历列表中的每个元素(尊重the convention),并为每个元素为每个属性构建一个隐藏字段你想要绑定。
但是因为那些是隐藏的字段,我想用户不应该修改它们。在这种情况下,这些隐藏字段在您的视图中无关。让我们不重新发明ViewState,当我们从经典的WebForms迁移到ASP.NET MVC时,我们都很高兴摆脱它们。简单地放一个包含唯一id的隐藏字段,这个字段允许你在POST操作中重新获取相应的列表元素,只要你从最初获取它们的地方(你想要的数据库或其他东西)获得这个唯一的id。
答案 1 :(得分:0)
您需要为列表中的每个对象设置一个隐藏元素,并命名为model[0]
,model[1]
等。