2011-04-15 161 views
2

我很好奇,想知道接近以下情形的最佳方式:如何綁定具有子視圖模型屬性的ViewModel?

public class LittleThingViewModel 
{ 
    public string Id{ get; set; } 
    public string Name { get; set; } 
    public string Location { get; set; } 
} 

public class BigThingViewModel 
{ 
    public LittleThingViewModel little1 {get; set; } 
    public LittleThingViewModel little2 {get; set; } 
    public string propA {get; set; } 
    public string propB {get; set; } 
    public string propC {get; set; } 
} 

在最初創建我的控制器的動作,我填充兩個LittleThingViewModels,將它們分配到一個新的BigThingViewModel,並把它傳遞給strongly-鍵入視圖。然後我使用EditorFor來渲染BigThing屬性A,B和C的編輯控件。

什麼是自動將LittleThingViewModels呈現到窗體的最佳技術,當我回發到控制器時,它會自動綁定? (我的目標是隻顯示名稱,並保持隱藏在其他屬性)

public ActionResult Create(BigThingViewModel b) 

我發現我除了呈現A,B和C的屬性兩個LittleThing子的ViewModels的每一個人財產POST期間,它成功地結合BigThingViewModel:

Html.DisplayFor(model=>model.little1.Name) 
Html.HiddenFor(model=>model.little1.Name) 
Html.HiddenFor(model=>model.little1.Id) 
Html.HiddenFor(model=>model.little1.Location) 

有沒有一種技術,可以讓我呈現的標籤,以及隱藏要素自動,而不必每次都做他們各自明確的?

喜歡的東西:

Html.RenderFor(model=>model.little1) 

感謝

回答

2

創建partial view是強類型的LittleThingViewModel。

LittleThingView.ascx(部分圖)

Html.DisplayFor(model=>model.Name) 
Html.HiddenFor(model=>model.Name) 
Html.HiddenFor(model=>model.Id) 
Html.HiddenFor(model=>model.Location) 

在主視圖

<% 
Html.RenderPartial("LittleThingView",model.little1); 
Html.RenderPartial("LittleThingView",model.little2); 
%> 

,使它看起來更好,你可以做一個集合在大視圖模型這些對象。因此,如果其中一個爲空,或者您需要多個,則不需要任何更改。

public class BigThingViewModel 
{ 
    public List<LittleThingViewModel> littles=new List<LittleThingViewModel>(); 
    public string propA {get; set; } 
    public string propB {get; set; } 
    public string propC {get; set; } 
} 

並在視圖:

<% 
foreach(var littleThingViewModel in model.littles) 
{ 
    Html.RenderPartial("LittleThingView",littleThingViewModel); 
} 
%> 
+1

我有一個類似的視圖模型和我使用的是局部視圖來渲染它。它在一個表單中,當我的POST操作在提交時被調用時,我的等價於LittleThingViewModel的屬性不會被填充。我是否需要爲此實現自定義模型聯編程序? – 2011-06-07 19:49:26

相關問題