1

我一直看到直接使用域模型作为视图的参数是不好的做法。但不这样做似乎过于复杂且容易出错。例子:

这是编辑的视图ItemViewModel

@model ItemViewModel 

@using (Html.BeginForm())
{
    <p>@Html.ValidationSummary()</p>

    @Html.LabelFor(o => o.ItemId) : @Html.EditorFor(o => o.ItemId)      
    @Html.LabelFor(o => o.MyItemProperty) : @Html.EditorFor(o => o.MyItemProperty)
}

这是处理此问题的控制器方法

public ActionResult Edit(int? id) 
{
    Item itemViewModel = new ItemViewModel();

    if (id != null && id != 0)
    {
        var item = itemRepository.Items.FirstOrDefault(c => c.Id == id);
        if (item != null)
        {
            itemViewModel.ItemId = item.ItemId;
            itemViewModel.MyItemProperty = item.ItemId;
        }
    }

    return View(itemViewModel);
}

[HttpPost]
public ActionResult Edit(ItemViewModel itemViewModel)
{
    var item = itemRepository.Items.FirstOrDefault(c => c.Id == itemViewModel.Id);
    item.Id = itemViewModel.Id;
    item.MyItemProperty = itemViewModel.MyItemProperty;
    itemRepository.Save(item);

    return View("Success");
}

这意味着我必须再次转换Item为。如果我添加一个新属性而我忘记将它添加到转换中,我最终会得到未保存的更改。ItemViewModelItemItem

这是你的做法还是我错过了什么?

4

1 回答 1

1

有几件事。正如您在上面查询的那样,我会从 Item 转换为 ItemModel 到 Item。然后有另一个名为 SomethingRelevantViewModel 的类,它具有您的 ItemModel 作为属性并且是视图的 @model。然后,您基本上可以将许多不同的 SomethingModel 附加到 DropDowns、Grids 等的 SomethingsModel 视图或列表中。

当您添加 DataAnnotations 时,您的 ItemModel 的真正魔力将是,因为您使用的是 LabelFor,所以看起来您可能正在使用它。您还可以将 DataAnnotations 用于所需和更复杂的事情。

我们经常使用数据优先的实体框架,并通过复制粘贴 T4 自动生成的类作为SomethingModel 的起点来作弊。有很多方法可以加快这个过程。

于 2013-02-28T20:45:19.380 回答