ASP.NET MVC - 使用表单发布多个复杂对象

时间:2010-01-25 23:19:47

标签: asp.net-mvc form-submit

在ASP.NET MVC应用程序中,我尝试使用单个表单提交多个对象。我可以获得简单的类型来回发,但是我遇到了复杂类型的问题。我觉得我模仿了Phil Haack在他的博客文章Model Binding To A List中提供的例子,但没有运气。即使复制他的代码也无济于事。

我正在尝试填充一组ProjectNum个对象的TaskNumMachineLicenseBillback属性。不幸的是,IList<MachineLicenseBillback> machinePts在发布时总是以null结尾。

我错过了什么?

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" />
<% } %>

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

Scott Hanselman对项目的绑定列表进行了完整的演练here。简而言之,您的控制器方法需要一个MachineLicenseBillback数组,而不是IList

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

查看代码,如果要绑定到IDictionary(而不是IList),则可以在视图中使用键/值对。或者可以保留视图中当前拥有的代码,并使用Array作为控制器方法中的参数。

特别注意命名约定。如果命名不匹配,模型绑定器将不会获取数据。