ASP.NET MVC - 使用表单提交多个复杂对象

5
在一个ASP.NET MVC应用程序中,我试图使用一个单一的表格提交多个对象。我能够得到简单类型的回传,但是在复杂类型方面出现了问题。我感觉我已经模仿了Phil Haack在他的博客文章Model Binding To A List中提供的示例,但没有成功。甚至复制他的代码也没有成功。
我正在尝试填充一组MachineLicenseBillback对象的ProjectNumTaskNum属性。不幸的是,当提交时,IList<MachineLicenseBillback> machinePts总是为空。
我错过了什么?
public class MachineLicenseBillback
{
    public MachineLicenseBillback() { }

    public virtual int MachineId { get; set; }
    public virtual string ProjectNum { get; set; }
    public virtual string TaskNum { get; set; }
    public virtual string VerifiedFlag { get; set; }
    public virtual DateTime? RcdChgDateTime { get; set; }
    public virtual string RcdChgAgent { get; set; }
}

动作

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult TrueUp(int id, IList<MachineLicenseBillback> machinePts)
{
  // ...
}

表单

<% using (Html.BeginForm("TrueUp", "Home", new { id = Model.Customer.Id },
             FormMethod.Post))
   { %>
<input type="hidden" name="machinePts.Index" value="<%= machine.MachineId %>" />

<input type="text" name="machinePts[<%= machine.MachineId%>].ProjectNum"
  value="<%= machine.MachineLicenseBillback.ProjectNum %>" />

<input type="text" name="machinePts[<%= machine.MachineId %>].TaskNum"
  value="<%= machine.MachineLicenseBillback.TaskNum %>" />

<input type="submit" value="Submit" />
<% } %>

1
我也没有成功地让Phil Haack的示例代码工作。我还尝试了几个其他的绑定到列表的示例,但都没有成功。 - Nathan Taylor
2个回答

2

.Index语法在MVC 1 RTM中被删除,然后在MVC 2中重新引入。对于MVC 1,列表元素必须按顺序编号:machinePts[0],machinePts[1]等。


那太糟糕了...你有一个链接能说明这是从MVC 1 RTM中删除的吗?更好奇的是为什么,虽然考虑到MVC 2很快就会推出,这并不重要。 - ahsteele
请参见http://forums.asp.net/p/1377775/2906260.aspx。简而言之,由于没有足够的人提出要求,因此它被删除并且QA资源被移动到其他地方。 - Levi

0

Scott Hanselman在这里完整演示如何绑定项目列表。简而言之,您的控制器方法需要一个MachineLicenseBillback数组,而不是IList

public ActionResult TrueUp(int id, MachineLicenseBillback[] machinePts)
{
  // ...
}

看了你的代码,如果你想绑定到一个 IDictionary(而不是一个 IList),你可以在视图中使用键值对。或者你可以保留当前视图中所用的代码,并在控制器方法的参数中使用一个数组。
特别注意命名约定。如果命名不匹配,模型绑定器就无法获取数据。

尝试将TrueUp操作切换为查找一个MachineLicenseBillback对象数组,但遇到了相同的问题:在回传时,machinePts为null。我已经阅读了Hanselman的帖子,但Haack的示例中的IList似乎更清晰明了。 - ahsteele

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接