我们有一个这样的视图模型:
public class myViewModel {
public Contract contract {get;set;}
public Vendor vendor {get;set;}
}
public class Contract {
public int contractID {get;set;}
// ... various string properties
public IList<ContractDetail> contractDetails {get;set;}
pubilc Vendor vendor {get;set;}
}
从表格中返回的是已完成的合同。
[HttpPost]
public ActionResult Edit(Contract contract) { ... }
所有工作都将表单post值绑定回合同参数属性。
当我们将供应商作为值对象移入契约时,契约的所有第一级“原始”属性都无法绑定。所有的IList<gt;属性都很好。
有什么想法或更多的信息,我们需要解决这个谜吗?有没有什么方法可以测试MVC如何将表单值绑定回对象参数?解决方案是否与供应商不是IList有关,即为什么IList属性工作正常?
编辑:
修复方法是在所有字段中绝对指定对象层次结构名称,例如,要绑定供应商名称,它需要一个名称“contract.vendor.name”。这个前缀是使用viewModel为我们完成的,但不是使用契约模型为我们完成的。我们最终为所有视图模板(部分视图)执行了此操作:
EditorFor(m => m.vendor, "Vendor", "Contract.vendor")
其中“vendor”是editorTemplate“vendor.ascx”的名称,“contract.vendor”是所有表单字段名称的前缀。
我猜是因为视图模型嵌套了所有数据,所以它导致MVC正确地给所有属性加前缀。这意味着没有对象前缀限定的“松散”表单字段不会绑定到命名参数对象。