我正在开发基于 MVC 4 的网络应用程序,并且正在尝试使用 HTML 表单进行一些工作。我在视图模型中有几个单独的模型,如下所示:
public class NewAccountViewModel
{
UserModel User { get; set; }
AccountModel Account { get; set; }
TicketModel Ticket { get; set; }
}
然后,我将其用作我的视图的模型。该视图还包含每个模型的局部视图。这些局部视图中的每一个也使用视图模型作为它们的模型,我从主视图传递视图模型实例,如下所示:
@Html.Partial("~/Views/Account/_User.cshtml", Model)
然后在部分视图中,我添加了以下字段:
@Html.TextBoxFor(m => m.User.Name)
在我的 POST 处理程序中,我接受视图模型实例作为参数,并且可以处理从那里的表单提交的数据。使用jQuery.post
,提交表单$('#nameofmyform').serialize()
作为数据。
这种方法就像预期的那样工作。但是,局部视图和视图模型之间的耦合过于紧密。如果我想在具有不同视图模型的不同控制器中使用用户模型,这是不可能的,因为部分视图使用这个特定的视图模型。
所以,我尝试的是这样的:
@Html.Partial("~/Views/Account/_User.cshtml", Model.User)
然后,使用实际模型作为局部视图的模型,我绑定了字段:
@Html.TextBoxFor(m => m.Name)
这是单向的,因为所有字段都使用来自视图模型及其包含的模型的数据正确填充。但是,在 POST 上,视图模型没有正确序列化回来。通过检查从表单发回的数据,我看到在第一种方法中,所有内容都绑定到视图模型,它使用如下数据序列化表单:
{ "User.Name" : "Blahblah" ...
而使用第二种方法时,它只是按模型序列化表单:
{ "Name" : "Blahblah" ...
这样,视图模型的模型属性在 POST 处理程序中都是空值。
所以,我真正想知道的是:是否有可能以某种方式从视图模型中添加属性名称,以便在我的视图模型中正确序列化?我需要在 JavaScript/通过 jQuery 中执行此操作,还是可以在我的 .NET 代码中执行此操作?