2013-03-11 74 views
1

我正在开发基于MVC 4的Web应用程序,并且我正在尝试使用HTML表单进行一些工作。我有一个视图模型中的几个单独的模型,如下所示:在MVC 4中提交的部分视图和模型jQuery表单提交0

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()作为数据提交。

此方法的工作方式与预期相同。但是,局部视图和视图模型之间的耦合过于紧密。如果我想在具有不同视图模型的不同控制器中使用User模型,那么这是不可能的,因为局部视图使用此特定视图模型。

所以,我尝试是这样的:

@Html.Partial("~/Views/Account/_User.cshtml", Model.User) 

,然后使用实际的模型作为局部视图的模型,我绑定的字段:

@Html.TextBoxFor(m => m.Name) 

这工作是单向的,因为所有字段都使用来自视图模型及其包含的模型的数据正确填充。但是,在POST上,视图模型未正确序列化回来。通过检查从形式发回的数据,我看到的是,在一切都绑定到视图模型的第一种方法,它系列化的形式,像这样的数据:

{ "User.Name" : "Blahblah" ... 

虽然用第二种方法,它只是通过模型序列化表单:

{ "Name" : "Blahblah" ... 

由此,视图模型的模型属性在POST处理程序中都是空值。

所以,我真正想知道的是:是否有可能以某种方式预先从视图模型的属性名称,以便它正确地序列化回我的视图模型?我需要在JavaScript中通过jQuery来做到这一点,还是可以在我的.NET代码中完成?

+1

您需要使用编辑器模板这一点。从今天早些时候查看[这个答案](http://stackoverflow.com/a/15339376/1317705) – 2013-03-11 15:40:25

回答

3

使用编辑模板,而不是局部的:

@Html.EditorFor(x => x.User, "_User") 

,然后定义~/Views/Shared/EditorTemplates/_User.cshtml

@model User 
... 
@Html.TextBoxFor(m => m.Name) 

现在您的输入字段将被正确命名是因为违背了谐音,编辑模板尊重导航上下文。

0

您可以设置字段的前缀,像这样:

ViewData.TemplateInfo.HtmlFieldPrefix = "User"; 
+0

但是这不是很可重用,因为你不能在其他属性中使用这个部分, '。编辑器模板是这里的方法。 – 2013-03-11 15:52:43