【问题标题】:ASP.NET MVC 2 Model Binding: How to debug a partially failed model binding on post back?ASP.NET MVC 2 模型绑定:如何在回发时调试部分失败的模型绑定?
【发布时间】: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


【解决方案1】:

只需下载 mvc source code ,做一个项目引用并通过默认绑定器进行调试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-30
    相关资源
    最近更新 更多