有一些相关的问题,但我找不到有效的答案。
假设我有以下模型:
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);
这成功更新了我的帐户属性模型,但是当我调用 UpdateModel 时account
(为了获取 EditorViewModel 的其余公共属性)我得到完全无用的“类型模型......无法更新”。没有内部异常,所以我无法弄清楚出了什么问题。
我该怎么办?
绑定器变得很困惑,因为它看到操作方法的参数被命名为account,它会看到名为的传入表单字段账户.账户名,因此它正在您的 EditorViewModel 上寻找 AccountName 属性。
您可以通过将参数重命名为与传入表单字段不冲突的其他名称来解决此问题,或者可以在参数上粘贴 [Bind(Prefix = "")] 属性。该属性表示“忽略参数命名的事实account,并假装我给了它一个空字符串名称。”然后活页夹将寻找账户.账户名代替账户.账户.账户名.
编辑-更多信息:
当绑定器看到一个名为的复杂参数时foo,它会查看当前对名为 *foo.** 的内容的请求。所以如果你的参数被命名为foo它的类型有一个名为的属性名,输入值预计为foo.FirstName=约翰, 例如。
但是,如果活页夹没有看到 *foo.** 作为请求的一部分,它只会直接查找 *(没有foo字首)。因此,只要请求中不存在 *foo.** ,您就可以提交名字=约翰活页夹会正确理解这一点。但如果请求中有任何 *foo.** ,名字=约翰值将与 FirstName 属性不匹配。
您现在可以看到如何将操作方法的参数与其属性之一同名,从而摆脱这种逻辑。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)