MVC - 在同一页面上与多个实体进行模型绑定

时间:2009-07-03 14:16:00

标签: asp.net-mvc

我想知道如何在我从页面上的多个实体返回信息的场景中使用模型绑定?

我想显示两个独立实体的字段组合,即客户+地址。我正在为我的模型使用Microsoft的DAAB和自定义业务实体。

有什么想法吗?

3 个答案:

答案 0 :(得分:20)

如果您尝试在回发时绑定到多个模型,则应尝试使用Bind属性并在参数中指定用于每个模型的前缀。在某些情况下 - 您可能无法为模型元素使用单独的前缀 - 您可能会发现使用多个TryUpdateModel和单独的白名单更容易,而不是将模型放在参数中。

public ActionResult Update( [Bind(Prefix="Customer")]Customer customer,
                            [Bind(Prefix="Address")]Address address )
{
   ...
}

这假设您有一个像:

的ViewModel
public class CustomerAddressModel
{
    public Customer Customer { get; set; }
    public Address Address { get; set; }
}

并引用它:

<%= Html.TextBox( "Customer.Name" ) %>
...
<%= Html.TextBox( "Address.Street" ) %>

或使用TryUpdateModel

public ActionResult Update( int id )
{
    var customer = db.Customers.Where( c => c.ID == id ).Single();

    var whitelist = new string[] { "name", "company", ... };
    if (TryUpdateModel( customer, whitelist ))
    {
        var addressWhitelist = new string[] { "street", "city", ... };
        if (TryUpdateModel( customer.Address, addressWhitelist ))
        {
            ...
        }
    }

}

在这种情况下,您的模型可能只包含您尝试更新的两个不同模型中的字段。

public class CustomerAddressModel
{
    public string Name { get; set; }
    public string Company { get; set; }
    public string Street { get; set; }
    ...
}

答案 1 :(得分:1)

简短的回答是:

  1. 使用您想要了解的域对象
  2. 构建ViewModel
  3. 然后使用@model<ViewModel type>作为视图中的第一行。
  4. 您现在已经强烈键入了View,并且可以访问Domain对象的所有属性。

答案 2 :(得分:-4)

您可以使用ViewData将多个模型传递给视图。

SomeControllerMethod()
{
    ...
    ViewData["Customer"] = myCustomer;
    ViewData["Address"] = myAddress;
}

观点:

Customer name: <%= (ViewData["Customer"] as Customer).Name %>
Street: <%= (ViewData["Address"] as Address).Street %>