2012-02-21 74 views
1

我有2個視圖模型是這樣的:MVC3嵌套部分頁面(和視圖模型):表單字段如何綁定?

public class ViewModel1 // maps to Model1 
{ 
    public string ViewModel1Desc { get; set; } 
    public ViewModel2 ViewModel2 { get; set; } 
    public ScheduleMasterEditViewModel() 
    { 
     ViewModel2= new ViewModel2(); 
    } 
} 

public class ViewModel2 // maps to Model2 
{ 
    public string ViewModel2Desc { get; set; } 
} 

現在,我想有ViewModel2部分頁面,幷包括在ViewModel1創建頁:

Create.cshtml看起來像這樣

@model ViewModels.ViewModel1 
@using (Html.BeginForm()) { 
    @Html.EditorFor(model => model.ViewModel1Desc) 
    @Html.Partial("~/Views/ViewModel2/_ViewModel2Create.cshtml", Model.ViewModel2) 
} 

_ViewModel2Create.cshtml看起來像

@model ViewModels.ViewModel2 
@Html.EditorFor(model => model.ViewModel2Desc) 

問題是,創建控制器型號1對,沒有東西勢必ViewModel1.ViewModel2

難道我這個做了正確的方式,或者我應該只寫了所有這樣的字段:

+0

你是如何渲染你的視圖? Html.RenderPartial或Html.RenderAction?他們服務於不同的目的 – CrazyCoderz 2012-02-21 15:33:42

回答

5

原因您ViewModel2未綁定的,因爲當你在生成的HTML你會發現,這個子模型創建的輸入字段具有不正確的名稱:

<input type="text" name="ViewModel2Desc" /> 

,而正確的是:

<input type="text" name="ViewModel2.ViewModel2Desc" /> 

原因是您的_ViewModel2Create.cshtml部分不保留父級的導航屬性上下文。

爲此,我建議你使用的編輯器模板,而不是局部的呼叫:

@model ViewModels.ViewModel1 
@using (Html.BeginForm()) { 
    @Html.EditorFor(model => model.ViewModel1Desc) 
    @Html.EditorFor(model => model.ViewModel2) 
} 

,然後將你的部分代碼裏面~/Views/Shared/EditorTemplates/ViewModel2.cshtml

​​

通知編輯器的位置模板:~/Views/Shared/EditorTemplates。這個很重要。這是ASP.NET MVC將查找它的地方。實際上,它將首先查找~/Views/XXX/EditorTemplates,其中XXX是更多特定模板的當前控制器名稱,並且它在共享文件夾中找不到一個外觀。另請注意文件的名稱:ViewModel2.cshtml。這也很重要,按慣例工作。模板的名稱實際上是屬性的類型。在你的視圖模型使用UIHint屬性

@Html.EditorFor(model => model.ViewModel2, "_ViewModel2Create") 

或:

你可以重寫此

public class ViewModel1 
{ 
    public string ViewModel1Desc { get; set; } 
    [UIHint("_ViewModel2Create")] 
    public ViewModel2 ViewModel2 { get; set; } 
    public ScheduleMasterEditViewModel() 
    { 
     ViewModel2 = new ViewModel2(); 
    } 
} 

,然後有~/Views/Shared/EditorTemplates/_ViewModel2Create.cshtml

+0

打我吧男人 – CrazyCoderz 2012-02-21 15:36:07

+0

非常感謝你,這似乎對我來說迄今爲止。出於好奇,有沒有什麼辦法可以使用partials?或僅僅是爲了顯示而不是編輯? – getit 2012-02-21 16:08:40