如何绑定具有子视图模型属性的ViewModel?
问题描述:
我很好奇,想知道接近以下情形的最佳方式:如何绑定具有子视图模型属性的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)
感谢
答
创建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);
}
%>
我有一个类似的视图模型和我使用的是局部视图来渲染它。它在一个表单中,当我的POST操作在提交时被调用时,我的等价于LittleThingViewModel的属性不会被填充。我是否需要为此实现自定义模型联编程序? – 2011-06-07 19:49:26