Asp.net mvc 2 需要为嵌套模型使用DefaultModelBinder的帮助吗
有几个相关的问题,但我找不到一个有效的答案 假设我有以下模型:Asp.net mvc 2 需要为嵌套模型使用DefaultModelBinder的帮助吗,asp.net-mvc-2,defaultmodelbinder,Asp.net Mvc 2,Defaultmodelbinder,有几个相关的问题,但我找不到一个有效的答案 假设我有以下模型: 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;
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
的视图,该视图执行以下操作:
<%= Html.TextBoxFor(model => model.Account.AccountName)%>
<%= Html.ValidationMessageFor(model => model.Account.AccountName)%>
<%= Html.TextBoxFor(model => model.SomeSimpleStuff )%>
<%= Html.ValidationMessageFor(model => model.SomeSimpleStuff )%>
如何让DefaultModelBinder正确绑定我的EditorViewModel?没有做任何特殊的操作,我得到一个EditorViewModel的空实例,所有内容都为null或default
我最接近的方法是手动调用UpdateModel
:
[HttpPost]
public virtual ActionResult Edit(EditorViewModel account)
{
account.Account = new Account();
UpdateModel(account.Account, "Account");
// this kills me:
UpdateModel(account);
这成功地更新了我的帐户属性模型,但当我在帐户上调用UpdateModel时(为了获取我的EditorViewModel的其余公共属性),我得到了完全没有帮助的“类型的模型…无法更新”。没有内部异常,因此我无法找出出什么问题
我该怎么办?活页夹变得很混乱,因为它看到操作方法的参数命名为account,并且它看到名为account.accountname的传入表单字段,所以它在EditorViewModel上查找accountname属性
您可以通过将参数重命名为与传入表单字段不冲突的其他名称来修复此问题,或者可以在参数上粘贴[Bind(Prefix=”“)]属性。该属性表示“忽略参数名为account的事实,并假设我为其指定了一个空字符串名称。”然后绑定器将查找account.accountname而不是account.accountname
编辑-更多信息:
当绑定器看到一个名为foo的复杂参数时,它会查看对任何名为*foo.*的对象的当前请求。因此,如果您的参数名为foo,并且其类型具有名为FirstName的属性,则传入值应为foo.FirstName=John,例如
但是,如果绑定器没有将*foo.**作为请求的一部分,那么它只会直接查找*(不带foo前缀)。因此,只要请求中没有*foo.**,您就可以提交FirstName=John,活页夹就会正确理解这一点。但是,如果请求中有任何*foo.**,FirstName=John值将与FirstName属性不匹配
现在,您可以看到,将参数赋予动作方法与其属性之一相同的名称将如何摆脱这种逻辑。Yknow,我认为您在这方面有所收获。我去看看。谢谢。是的,名字把它搞砸了。魔术弦的副作用。
[HttpPost]
public virtual ActionResult Edit(EditorViewModel account)
{
account.Account = new Account();
UpdateModel(account.Account, "Account");
// this kills me:
UpdateModel(account);