2010-01-25 37 views
5

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

我想填充一组MachineLicenseBillback对象的ProjectNumTaskNum属性。不幸的是,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" /> 
<% } %> 
+1

我也有machinePts [0],machinePts [1],等等Phil Haack的示例代码没有成功。我也尝试了其他一些绑定到列表的示例,但没有任何运气。 – 2010-01-25 23:23:12

回答

2

是为MVC 1 RTM除去的.index语法和MVC 2.重新对于MVC 1,列表元素必须顺序编号:

+0

那么,这太糟糕了......你有链接指出这是从MVC 1 RTM中删除?对于为什么*更好奇,并不是说真的很重要,因为MVC 2很快就会出来。 – ahsteele 2010-01-26 00:37:32

+0

请参阅http://forums.asp.net/p/1377775/2906260.aspx。简而言之,没有足够的人提出要求,因此将其删除,并将质量检查资源移至别处。 – Levi 2010-01-26 17:34:41

0

斯科特Hanselman有一个完整的演练here用于绑定项目列表。简而言之,您的控制器方法需要一个MachineLicenseBillback的数组,而不是一个IList。在你的代码

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

看,如果你想绑定到IDictionary(不是一个IList),您可以在视图中使用键/值对来代替。或者可以保留当前视图中的代码,并使用Array作为控制器方法中的参数。

要特别注意命名约定。如果命名不匹配,模型联编程序将不会提取数据。

+0

尝试切换TrueUp操作来查找'MachineLicenseBillback'对象的数组,并且遇到同样的问题:machinePts在回发时为'null'。我读过汉塞尔曼的文章,但哈克案例中的“IList”似乎更清楚。 – ahsteele 2010-01-26 00:01:41