2009-01-02 58 views
9

以下面的示例类。我想在表单上显示客户和两个地址(来自列表)。 MVC测试版中的模型联编程序是否支持这个功能,还是需要编写我自己的定制联编程序?ASP.NET MVC Beta支持列表中的模型绑定器<T>?

public class Customer 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public List<Address> Addresses { get; set; } 

    public Customer() 
    { 
     Addresses = new List<Address>(); 
    } 

} 

public class Address 
{ 
    public int Line1 { get; set; } 
    public int Line2 { get; set; } 
    public int City { get; set; } 
    public int State { get; set; } 
    public int Zip { get; set; } 
} 

你会如何编码字段?喜欢这个?

<!-- some HTML formatting --> 
<%= Html.TextBox("customer.address.line1", ViewData.Customer.Address[0].Line1)%> 
<!-- some more HTML formatting --> 
<%= Html.TextBox("customer.address.line1", ViewData.Customer.Address[1].Line1)%> 
<!-- end of HTML form formatting --> 

回答

5

我从来没有尝试过,但看到this后,它是关于模型绑定到列表,也许它可以帮助你。

0

您可以通过使用的ViewData这样一个对象名单,但你需要改变某些行。在这里阅读更多:

http://weblogs.asp.net/scottgu/archive/2007/12/06/asp-net-mvc-framework-part-3-passing-viewdata-from-controllers-to-views.aspx

这里:

ASP.NET MVC: How do I pass a list (from a class in Model) to a repeater in a View?

希望这有助于


编辑


如果使用模型,则需要先设置DataContext并选择列表,但如果使用LINQ,则可以使用生成的类。

0

我定义了一个类似的对象。我按照上面提到的绑定到列表的方式跟踪帖子,绑定工作时,我无法在控制器的操作参数中使用绑定白名单或黑名单。该模型是一个IList

1

使用MvcContrib的NameValueDeserializer使其更简单。假设您的网页来源于ViewPage <客户>。你可以这样做:

<%= Html.TextBox("Address[0].Line1", ViewData.Model.Address[0].Line1)%> 
<%= Html.TextBox("Address[1].Line1", ViewData.Model.Address[1].Line1)%> 

这:

public ActionResult Save([Deserialize]Customer customer) 

而且客户将从形式与后填入地址收集反序列化。您的索引不必按顺序排列 - 这支持您希望在发布帖子之前删除客户端上的行的情况。

如果您从视图数据字典(而不是模型)反序列化某些内容,则语法类似[Deserialize(“customer”)],其中“customer”是前缀。

您可能会感兴趣并且相关blog post

1

只是为了使这个完整。使用名称为Index的隐藏字段很重要。所以我上面的代码变成这样:

<!-- some HTML formatting --> 
<%= Html.Hidden("customer.address.Index", 0) %> 
<%= Html.TextBox("customer.address[0].line1", ViewData.Customer.Address[0].Line1)%> 
<!-- some more HTML formatting --> 
<%= Html.Hidden("customer.address.Index", 1) %> 
<%= Html.TextBox("customer.address[1].line1", ViewData.Customer.Address[1].Line1)%> 
<!-- end of HTML form formatting --> 

它就像一个魅力!

+0

我想我会在不久的将来需要类似的东西,很好的问题。 – 2009-01-06 10:39:30