【问题标题】:MVC - Model binding with multiple entities on the same pageMVC - 在同一页面上与多个实体的模型绑定
【发布时间】:2017-01-19 16:22:36
【问题描述】:

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

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

有什么想法吗?

【问题讨论】:

  • 这是重复的,我很确定。为您的 Customer 和 Address 对象创建一个具有公共属性的 Model 对象。

标签: asp.net-mvc


【解决方案1】:

如果您尝试在回发时绑定到多个模型,您应该尝试使用 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; }
    ...
}

【讨论】:

  • + 但也许“try/catch with UpdateModel”比这种“嵌套 if(TryUpdateModel” 构造更好?
  • @eu-ge-ne——也许吧。这将取决于您如何处理更新模型状态的错误。如果没有实际为代码编写测试,就很难确切地知道应该做什么。
【解决方案2】:

简短的回答是:

  1. 使用您想要了解相关信息的域对象构建您的 ViewModel,
  2. 然后使用@model&lt;ViewModel type&gt; 作为视图的第一行。

您现在已经对视图进行了强类型化,并且可以访问这两个域对象的所有属性。

【讨论】:

    【解决方案3】:

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

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

    还有观点:

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

    【讨论】:

    • 这会将多个对象传递给视图,它们不是模型,您将无法通过视图模型对象访问它们的属性。
    猜你喜欢
    • 2016-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多