何时使用“视图模型”,“部分模型”,“模板”并通过MVC 3处理子绑定

|| 我是mvc3的新手,我有几个问题,如果有人可以回答/提供链接,我们将不胜感激: 我什么时候应该使用视图模型?不建议使用域吗?我发现我的视图模型是域对象的副本,但是看不到值... 我什么时候应该使用局部变量?只有部分视图可以重用吗? 我什么时候应该使用显示模板和编辑器模板?我可以在没有视图模型的情况下使用它们吗? 如何创建一个父对象和子对象列表都可编辑的编辑屏幕?即顶部的几个字段(父字段)和下方的一个网格字段(如可编辑行),特别是,我该如何进行绑定?不使用automapper。 谢谢!     
已邀请:
           我什么时候应该使用视图模型?不建议使用域吗?我发现我的视图模型是域对象的副本,但是看不到值... 应始终使用视图模型。您不应在视图中使用域模型。 视图模型不是域模型的精确副本。它们始终与视图的特定要求有关。例如,您希望在一个屏幕上显示域模型的某些属性,而在其他屏幕上则显示其他属性。因此,您还将具有不同的验证要求,因为一个属性在一个屏幕上是必需的,而在另一屏幕上则不需要。因此,您还将在这些视图模型上具有不同的数据注释。   我什么时候应该使用局部变量?只有部分视图可以重用吗? 不仅会重复使用该视图。局部可以用来使您的视图更加结构化。另外,如果您使用的是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\" />
}
最后一块是孩子(editor3 template)的编辑器模板:
@model ChildViewModel
<tr>
    <td>
        @Html.LabelFor(x => x.Name)
        @Html.EditorFor(x => x.Name)
        @Html.ValidationMessageFor(x => x.Name)
    </td>
</tr>
    

要回复问题请先登录注册