11

新MVC3,我有几个问题,希望如果有人能回答/提供链接:什么时候使用视图模型,局部模板,模板和处理孩子的绑定与MVC 3

  1. 何时应该使用查看模型?不推荐使用域名吗?我发现我的视图模型是我的域对象的副本,并没有看到值...
  2. 什么时候应该使用部分?是否只有部分视图会被重用?
  3. 什么时候应该使用显示模板和编辑器模板?我可以使用这些没有视图模型?
  4. 如何创建编辑屏幕,其中父对象和子对象列表都可编辑?即顶部(父)的几个字段和下面的字段网格(如可编辑的行),特别是,我如何进行绑定?不使用automapper。

谢谢!

回答

23

什么时候应该使用查看模型?不推荐使用域名吗?我发现我的视图模型是我的域对象的副本,并没有看到该值...

应始终使用视图模型。您不应该在视图中使用您的域模型。

查看模型不是域模型的精确副本。他们总是有一些与视图的具体要求有关的差异。例如,在一个屏幕上,您想要展示域模型的一些属性,并在其他屏幕上显示其他属性。因此,您也将拥有不同的验证要求,因为一个属性将在一个屏幕上需要,而其他屏幕上则不需要。因此,您在这些视图模型上也会有不同的数据注释。

什么时候应该使用Partials?是否只有部分视图会被重用?

不仅如果视图将被重用。部分可以用来使你的观点更加结构化。另外,如果您使用的是AJAX,则偏旁变得更容易。您可以将AJAX请求发送给控制器操作,该操作将返回一个局部视图,允许您仅更新DOM的部分内容。

什么时候应该使用显示模板和编辑器模板?我可以使用这些没有视图模型?

总是。您可以将它们与任何强类型模型一起使用,但应始终使用视图模型(请参阅前一问题的答案)。

如何创建编辑屏幕,父对象和子对象列表都可编辑?即顶部(父)的几个字段和下面的字段网格(如可编辑的行),特别是,我如何进行绑定?不使用automapper。

那而是一如既往你开始定义您的视图模型将代表/包含的属性,你想提出这个屏幕上编辑回答的人一个非常宽泛的问题:

public class ChildViewModel 
{ 
    [Required] 
    public string Name { get; set; } 
} 

public class ParentViewModel 
{ 
    [Required] 
    public string Name { get; set; } 

    public IEnumerable<ChildViewModel> Children { get; set; } 
} 

然后控制器:

public class HomeController: Controller 
{ 
    public ActionResult Index() 
    { 
     // TODO: Fetch an actual domain model from your repository, 
     // and map it to the view model (AutoMapper is a great tool for the job) 

     var model = new ParentViewModel 
     { 
      Name = "parent name", 
      Children = Enumerable.Range(1, 5).Select(x => new ChildViewModel 
      { 
       Name = "child " + x 
      }) 
     }; 
     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Index(ParentViewModel model) 
    { 
     if (!ModelState.IsValid) 
     { 
      return View(model); 
     } 

     // TODO: the model object here will contain the new values 
     // => user AutoMapper to map it back to a domain model 
     // and pass this domain model to the repository for processing 

     return RedirectToAction("Index"); 
    } 
} 

最后视图:

@model ParentViewModel 
@using (Html.BeginForm()) 
{ 
    <h2>Parent</h2> 
    <div> 
     @Html.LabelFor(x => x.Name) 
     @Html.EditorFor(x => x.Name) 
     @Html.ValidationMessageFor(x => x.Name) 
    </div> 

    <h2>Children</h2> 
    <table> 
     <thead> 
      <tr> 
       <th>Child name</th> 
      </tr> 
     </thead> 
     <tbody> 
      @Html.EditorFor(x => x.Children) 
     </tbody> 
    </table> 
    <input type="submit" value="OK" /> 
} 

和最后一块是一个孩子的编辑模板(~/Views/Home/EditorTemplates/ChildViewModel.cshtml):

@model ChildViewModel 
<tr> 
    <td> 
     @Html.LabelFor(x => x.Name) 
     @Html.EditorFor(x => x.Name) 
     @Html.ValidationMessageFor(x => x.Name) 
    </td> 
</tr> 
+0

谢谢!这真的很有帮助,只是想澄清几点:1.模型绑定是否能够自动绑定父母和孩子? 2.我是否需要为EditorFor创建显示和编辑器模板?或者是mvc足够聪明,可以基于视图模型为我创建它们? 3.编辑特定视图的视图模型是否应包含该视图所需的所有内容或只包含可编辑字段?有些领域可能需要只读... – 2011-05-29 13:09:46

+0

伟大的答案Darin! – 2011-07-13 07:46:29

+0

我有关于如何处理编辑和创建视图模型的相同问题。由于没有退出子数据,我有一种情况,编辑需要创建期间无法填充的字段。在这种情况下你创建两个视图模型吗? – PilotBob 2012-01-13 16:04:43