如何绑定具有sub-viewmodel属性的ViewModel?

时间:2011-04-15 01:24:51

标签: asp.net-mvc-3 viewmodel html-helper

我很想知道解决以下情况的最佳方法:

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; }
}

在我的控制器的初始CREATE操作中,我填充了两个LittleThingViewModel,将它们分配给新的BigThingViewModel并将其传递给强类型视图。然后,我使用EditorFor为BigThing属性A,B和C渲染编辑控件。

将LittleThingViewModels自动渲染到表单的最佳技术是什么,这样当我回发到我的控制器时它会自动绑定? (我的目标是只显示名称并隐藏其他属性)

public ActionResult Create(BigThingViewModel b) 

我发现除了两个LittleThing子视图模型的每个属性之外,我还可以呈现A,B和C属性,并且它在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)

由于

1 个答案:

答案 0 :(得分:2)

创建一个强类型为LittleThingViewModel的partial view

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);
%>

为了让它看起来更好,你可以在大型ViewModel中为这些对象制作一个集合。因此,如果其中一个为null或您需要多个,则不需要任何更改。

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);
}
%>