1

我正在开发基于 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 代码中执行此操作?

4

2 回答 2

3

使用编辑器模板而不是部分模板:

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

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

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

现在您的输入字段将被正确命名,因为与部分相反,编辑器模板尊重导航上下文。

于 2013-03-11T15:48:45.623 回答
0

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

ViewData.TemplateInfo.HtmlFieldPrefix = "User";
于 2013-03-11T15:49:00.693 回答