2011-04-15 136 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

相关问题