【发布时间】:2017-01-19 16:22:36
【问题描述】:
我想知道如何在我从页面上的多个实体返回信息的情况下使用模型绑定?
我想显示来自两个独立实体的字段组合,即客户 + 地址。我正在为我的模型使用 Microsoft 的 DAAB 和自定义业务实体。
有什么想法吗?
【问题讨论】:
-
这是重复的,我很确定。为您的 Customer 和 Address 对象创建一个具有公共属性的 Model 对象。
标签: asp.net-mvc
我想知道如何在我从页面上的多个实体返回信息的情况下使用模型绑定?
我想显示来自两个独立实体的字段组合,即客户 + 地址。我正在为我的模型使用 Microsoft 的 DAAB 和自定义业务实体。
有什么想法吗?
【问题讨论】:
标签: asp.net-mvc
如果您尝试在回发时绑定到多个模型,您应该尝试使用 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; }
...
}
【讨论】:
简短的回答是:
@model<ViewModel type> 作为视图的第一行。 您现在已经对视图进行了强类型化,并且可以访问这两个域对象的所有属性。
【讨论】:
您可以使用 ViewData 将多个模型传递给一个视图。
SomeControllerMethod()
{
...
ViewData["Customer"] = myCustomer;
ViewData["Address"] = myAddress;
}
还有观点:
Customer name: <%= (ViewData["Customer"] as Customer).Name %>
Street: <%= (ViewData["Address"] as Address).Street %>
【讨论】: