我们有一个看起来像这样的视图模型:
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) { ... }
所有工作都将后期值绑定到合约参数属性。
当我们将供应商作为价值对象转移到合约时,合约的所有第一级“原始”属性都无法绑定。所有IList&lt;&gt;物业很好。
我们需要什么想法或更多信息来解决这个谜题?有没有办法测试MVC如何将表单值绑定回对象参数?解决方案是否与供应商不是IList有关,即为什么IList属性可以正常工作?
编辑:
修复是绝对指定所有字段中的对象层次结构名称,例如,对于要绑定的供应商名称,它需要名称“Contract.vendor.name”。这个前缀是使用ViewModel为我们完成的,但是没有使用Contract模型为我们完成。我们最终为所有视图模板(部分视图)执行此操作:
EditorFor(m => m.vendor, "Vendor", "Contract.vendor")
其中“Vendor”是EditorTemplate“Vendor.ascx”的名称,“Contract.vendor”是所有表单字段名称的前缀。
我猜因为ViewModel嵌套了所有数据,所以它导致MVC正确地为所有属性添加前缀。这意味着不受对象前缀限定的“松散”表单字段将不会绑定到命名参数对象。