2013-03-11 67 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