gpt4 book ai didi

asp.net-mvc-2 - 需要帮助将 DefaultModelBinder 用于嵌套模型

转载 作者:行者123 更新时间:2023-12-01 13:06:42 26 4
gpt4 key购买 nike

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

假设我有以下模型:

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> 的 View 它执行以下操作:

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

我的 Controller 看起来像:

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

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

我最接近的是调用 UpdateModel手动:

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

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

我该怎么办?

最佳答案

Binder 越来越困惑,因为它看到您的操作方法的参数名为 account,并且它看到传入的表单字段名为 account.accountname,所以它正在查找对于 EditorViewModel 上的 AccountName 属性。

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

编辑 - 更多信息:

当 Binder 看到名为 foo 的复杂参数时,它会查看当前对任何名为 *foo.** 的请求。因此,如果您的参数名为 foo 并且其类型具有名为 FirstName 的属性,则传入值应为 foo.FirstName=John ,例如。

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

您现在可以看到,如果将参数赋予您的操作方法与其属性之一具有相同的名称,将如何摆脱此逻辑。

关于asp.net-mvc-2 - 需要帮助将 DefaultModelBinder 用于嵌套模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2563685/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com