ASP.NET MVC:将动态呈现的部分视图绑定为视图模型的嵌套属性

时间:2014-01-15 14:30:15

标签: c# asp.net asp.net-mvc-4 jquery data-binding

我有以下视图模型:

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动态加载其中一个代表BankAccountPayPalAccount的部分视图,然后将其添加到页面中。

用户点击提交后,我会调用此操作:

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视图模型中的嵌套属性?

1 个答案:

答案 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。而且实施起来比较困难,而且“标准较低”。