我有以下视图模型:
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
public BankAccount BankAccount { get; set; }
public PayPalAccount PayPalAccount { get; set; }
}
public class BankAccount
{
public string BankName { get; set; }
public string AccountNumber { get; set; }
}
public class PayPalAccount
{
public string PayPalEmail { get; set; }
}
在我的单个视图中,我有一个绑定Person
模型的表单,还有一个DropDownList
,让用户可以选择帐户类型。
一旦用户做出选择,我使用jQuery ajax动态加载其中一个代表BankAccount
或PayPalAccount
的部分视图,然后将其添加到页面中。
用户点击提交后,我会调用此操作:
public ActionResult Save(Person person)
{
// Here I expect that either person.BankAccount or person.PayPalAccount
// will contain the user input, and the other will be null
}
如何将部分视图属性绑定到Person
视图模型中的嵌套属性?
答案 0 :(得分:2)
您的表单字段必须以BankAccount.
或PayPalAccount.
为前缀,以便自动绑定。
当您从Ajax返回部分视图时,使用您正在使用的当前模型,它们的名称没有前缀。
为它们添加前缀的更简单方法是对两个部分视图使用完全相同的View Model类:Person
。如果你这样做,在Razor你必须写
@Html.EditorFor(m => m.BankAccount.BankName)
生成的输入字段将具有所需的前缀BankAccount.
,即它将如下所示:<input ... name='BankAccount.BankName' ... />
你也可以为你的部分创建这样的视图模型:
public class BakAccountModel
{
// make sure the property name is the same as in the Person view model
public BankAccount { get; set; }
}
最后,您可以尝试这样的解决方案: ASP.NET MVC partial views: input name prefixes
我无法保证最后一个解决方案能正常工作:例如它可能会破坏ModelState
。而且实施起来比较困难,而且“标准较低”。