我有一个带有表单的视图,它具有来自模型/数据库的数据绑定,具有1对多的entites /表。
视图引用Contract类以形成具有以下属性的合同对象:Customer ID FK,Customer虚拟对象以及与其他表相关的其他对象ID和虚拟对象。我正在使用实体框架。
模型中的合同类:
public partial class Contract
{
public int Contract_ID { get; set; }
public System.DateTime DateCreated { get; set; }
public string CustomerId { get; set; }
public Nullable<int> Status_ID { get; set; }
public Nullable<int> SA_ID { get; set; }
public virtual Customer Customer { get; set; }
public virtual ContractStatus ContractStatus { get; set; }
public virtual ServicesAccess ServicesAccess { get; set; }
}
我没有使用View模型,因为它可能会引入冗余。我也不确定如何使用View Model。
当我通过索引页面编辑合同并保存时,它会将一个null Customer对象从Contract发布到HTTPPost edit方法参数。 对于合同,我只是不希望对客户进行编辑,因此在编辑视图中我有:
@Html.HiddenFor(model => model.CustomerId)
<div class="display-field">
@Html.DisplayFor(model => model.Customer.CustomerLegalName)
所以我从合同中正确地获得了客户ID。 而获取Edit方法没有null Customer对象。为什么会这样?这也发生在ServicesAccess对象上。
在带有edit方法的控制器中,要获取要保存的对象,我必须通过这种方式找到对象:
contract.ServicesAccess = db.ServicesAccesses.Find(contract.SA_ID);
如果我不这样做,那么contract.Customer或contract.ServiceAccess为null或使用null属性初始化。 欢呼声。
答案 0 :(得分:1)
因为asp.net中的默认模型绑定器不知道如何绑定到复杂的子对象。你可以写自己的,但为什么还需要。您已经将客户传回了帖子。
答案 1 :(得分:1)
你试图在一个模型中做很多事情。 DefaultModelBinder不会绑定Model的复杂属性。如果您想要执行我认为您要实现的目标并发布客户对象并将其紧密绑定到控制器中的客户对象,那么您需要创建一个采用Customer类型的部分视图。在此部分视图中,您将编辑客户并使用视图中的客户属性发布到控制器。
@model Contract
// some of your markup code here
// when you get to the Customer Edit do something like this
Html.Partial("EditForCustomerView", Model.Customer)
然后在该局部视图中放置您的客户属性。
答案 2 :(得分:1)
页面加载时,它是否在model.Customer
上有值?你试过一步吗?我猜测Customer
对象中有一个不可为空的值属性。如果是,请尝试为该属性添加@Html.HiddenFor(model => model.Customer.NotNullableProperty)