11

mvc3 的新手,我有几个问题,如果有人可以回答/提供链接,我将不胜感激:

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

谢谢!

4

1 回答 1

23

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

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

视图模型不是领域模型的精确副本。它们总是有一些与视图的特定要求相关的差异。例如,您希望在一个屏幕上展示您的域模型的一些属性,而在其他屏幕上展示其他属性。因此,您还将有不同的验证要求,因为一个屏幕上需要一个属性,而另一个屏幕上不需要。因此,您还将在这些视图模型上拥有不同的数据注释。

我什么时候应该使用分音?只有部分视图会被重用吗?

不仅视图将被重用。部分可用于使您的视图更有条理。此外,如果您使用 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>
于 2011-05-28T09:01:57.717 回答