English 中文(简体)
ASP.NET MVC Beta的模型绑定器是否支持List <T>?
原标题:
  • 时间:2009-01-02 17:29:06
  •  标签:

请参考下面的示例类。我想在表单上显示客户和两个地址(来自列表)。MVC beta中的模型绑定器是否支持此操作,还是我需要编写自己的自定义绑定器?

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 -->
最佳回答

我从未尝试过,但是看到这篇文章,它讲的是将模型绑定到列表,也许它可以帮助你。

问题回答

使用MvcContrib的NameValueDeserializer来使它更简单。假设你的页面派生自ViewPage<Customer>,你可以这样做:

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

And this: 这个

public ActionResult Save([Deserialize]Customer customer)

客户端将从填写了地址集合的表单中进行反序列化。您的索引不必按顺序排列,这支持在提交前在客户端上删除行的情况。

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

您可能会觉得这篇博客文章有趣并与您相关。

为了让这个完整。重要的是使用名称为“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 -->

它真是太棒了!

你可以像这样通过ViewData传递对象列表,但你需要更改一些行。在这里阅读更多信息:

将此翻译成中文:http://weblogs.asp.net/scottgu/archive/2007/12/06/asp-net-mvc-framework-part-3-passing-viewdata-from-controllers-to-views.aspx 从控制器传递ViewData到视图的ASP.NET MVC框架的第3部分。

And here: 这里

ASP.NET MVC:如何将模型中的列表传递给视图中的重复器?

希望这有所帮助。


编辑


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

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





相关问题
热门标签