mvc3 的新手,我有几个问题,如果有人可以回答/提供链接,我将不胜感激:
- 我什么时候应该使用视图模型?不建议使用域名吗?我发现我的视图模型是我的域对象的副本,并且看不到值...
- 我什么时候应该使用分音?只有部分视图会被重用吗?
- 什么时候应该使用显示模板和编辑器模板?我可以在没有视图模型的情况下使用这些吗?
- 如何创建一个编辑屏幕,其中父对象和子对象列表都是可编辑的?即顶部(父)的几个字段和下面的字段网格(如可编辑行),特别是,我如何进行绑定?不使用自动映射器。
谢谢!
mvc3 的新手,我有几个问题,如果有人可以回答/提供链接,我将不胜感激:
谢谢!
我什么时候应该使用视图模型?不建议使用域名吗?我发现我的视图模型是我的域对象的副本,并且看不到值...
应始终使用视图模型。您不应在视图中使用域模型。
视图模型不是领域模型的精确副本。它们总是有一些与视图的特定要求相关的差异。例如,您希望在一个屏幕上展示您的域模型的一些属性,而在其他屏幕上展示其他属性。因此,您还将有不同的验证要求,因为一个屏幕上需要一个属性,而另一个屏幕上不需要。因此,您还将在这些视图模型上拥有不同的数据注释。
我什么时候应该使用分音?只有部分视图会被重用吗?
不仅视图将被重用。部分可用于使您的视图更有条理。此外,如果您使用 AJAX,则使用部分功能会更容易。您可以将 AJAX 请求发送到控制器操作,该操作将返回部分视图,允许您仅更新 DOM 的一部分。
什么时候应该使用显示模板和编辑器模板?我可以在没有视图模型的情况下使用这些吗?
总是。您可以将它们与任何强类型模型一起使用,但您应该始终使用视图模型(请参阅对上一个问题的回答)。
如何创建一个编辑屏幕,其中父对象和子对象列表都是可编辑的?即顶部(父)的几个字段和下面的字段网格(如可编辑行),特别是,我如何进行绑定?不使用自动映射器。
这是一个相当广泛的问题,但要像往常一样回答它,首先要定义视图模型,该模型将表示/包含您希望在此屏幕上显示以进行编辑的属性:
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>