【问题标题】:Need help using the DefaultModelBinder for a nested model需要帮助将 DefaultModelBinder 用于嵌套模型
【发布时间】:2010-04-01 21:03:23
【问题描述】:

有一些相关的问题,但我找不到有效的答案。

假设我有以下模型:

public class EditorViewModel
{
  public Account Account {get;set;}
  public string SomeSimpleStuff {get;set;}
}

public class Account
{
  public string AccountName {get;set;}
  public int MorePrimitivesFollow {get;set;}
}

还有一个扩展 ViewPage<EditorViewModel> 的视图,它执行以下操作:

<%= Html.TextBoxFor(model => model.Account.AccountName)%>
<%= Html.ValidationMessageFor(model => model.Account.AccountName)%>
<%= Html.TextBoxFor(model => model.SomeSimpleStuff )%>
<%= Html.ValidationMessageFor(model => model.SomeSimpleStuff )%>

我的控制器看起来像:

[HttpPost]
public virtual ActionResult Edit(EditorViewModel account)
{ /*...*/ }

如何让 DefaultModelBinder 正确绑定我的 EditorViewModel?没有做任何特别的事情,我得到了一个 EditorViewModel 的空实例,它的所有内容都为 null 或默认值。

我最接近的是手动调用UpdateModel

[HttpPost]
public virtual ActionResult Edit(EditorViewModel account)
{
    account.Account = new Account();
    UpdateModel(account.Account, "Account");
    // this kills me:
    UpdateModel(account);

这成功更新了我的 Account 属性模型,但是当我在 account 上调用 UpdateModel (以获取我的 EditorViewModel 的其余公共属性)时,我得到完全没有帮助的“类型的模型......无法更新。”没有内部异常,所以我不知道出了什么问题。

我该怎么办?

【问题讨论】:

    标签: asp.net-mvc-2 defaultmodelbinder


    【解决方案1】:

    活页夹很困惑,因为它看到你的操作方法的参数名为 account,它看到传入的表单字段名为 account.accountname,所以它正在寻找为您的 EditorViewModel 上的 AccountName 属性。

    您可以通过将参数重命名为不与传入表单字段冲突的其他名称来解决此问题,或者您可以在参数上粘贴 [Bind(Prefix = "")] 属性。该属性表示“忽略参数名为 account 的事实,并假装我给了它一个空字符串名称。”然后活页夹将寻找 account.accountname 而不是 account.account.accountname

    编辑 - 更多信息:

    当 binder 看到一个名为 foo 的复杂参数时,它会查看当前对任何名为 *foo.** 的请求的请求。因此,如果您的参数被命名为 foo 并且它的类型有一个名为 FirstName 的属性,那么传入的值应该是 foo.FirstName=John ,例如。

    但是,如果绑定器没有看到 *foo.** 作为请求的一部分,它只会直接查找 *(没有 foo 前缀)。因此,只要请求中不存在 *foo.**,您就可以提交 FirstName=John,并且活页夹会正确理解这一点。但是,如果请求中有任何 *foo.**,则 FirstName=John 值将与 FirstName 属性不匹配。

    您现在可以看到如何将参数赋予您的操作方法与其属性之一相同的名称会抛出此逻辑。

    【讨论】:

    • 你知道,我认为你有一些东西。我会检查一下。谢谢。
    • 是的,这个名字搞砸了。魔术字符串的副作用。
    猜你喜欢
    • 2011-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-02
    • 2011-03-15
    相关资源
    最近更新 更多