【发布时间】:2010-08-04 15:15:10
【问题描述】:
我们有一个看起来像这样的视图模型:
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) { ... }
所有工作都将表单发布值绑定到合约参数属性。
当我们将 vendor 作为值对象移入 Contract 时,Contract 的所有第一级“原始”属性都无法绑定。所有 IList 属性都很好。
解开这个谜题我们需要任何想法或更多信息吗?有什么方法可以测试 MVC 如何将表单值绑定回对象参数?解决方案是否与 Vendor 不是 IList 有关,即为什么 IList 属性可以正常工作?
编辑:
修复是在所有字段中绝对指定对象层次结构名称,例如,对于要绑定的供应商名称,它需要一个名称“Contract.vendor.name”。这个前缀是使用 ViewModel 为我们完成的,但不是使用 Contract 模型为我们完成的。我们最终对所有视图模板(部分视图)都这样做了:
EditorFor(m => m.vendor, "Vendor", "Contract.vendor")
其中“Vendor”是 EditorTemplate 的名称,“Vendor.ascx”和“Contract.vendor”是所有表单字段名称的前缀。
我猜是因为 ViewModel 嵌套了所有数据,它导致 MVC 正确地为所有属性添加前缀。这意味着没有对象前缀限定的“松散”表单字段将不会绑定到命名参数对象。
【问题讨论】:
-
当您将 Vendor 作为价值对象移动到合同中时,您是什么意思?你的意思是当你把
public Vendor vendor {get; set;}放在你的 Contract 类中时? -
当我们将 Vendor 从 myViewModel.Vendor 移动到 Contract.Vendor 时
标签: c# asp.net-mvc-2 model-binding