如何有效地用视图模型代替域模型的使用

本文关键字:模型 视图 有效地 | 更新日期: 2023-09-27 18:01:33

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

下面是编辑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转化为ItemViewModel再转化为Item。如果我添加一个新的属性到Item,我忘记添加它的转换,我将以未保存的更改结束。

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

如何有效地用视图模型代替域模型的使用

有几件事。我将从Item转换为ItemModel再转换为Item,就像您上面查询的那样。然后有另一个类叫SomethingRelevantViewModel它有你的ItemModel作为属性是视图的@model。然后你可以将许多不同的SomethingModels附加到View或Lists of SomethingModels上,用于下拉列表、网格等。

ItemModel的真正神奇之处在于当您添加DataAnnotations时,因为您正在使用LabelFor,所以看起来您可能正在使用它。您还可以使用DataAnnotations来处理必需的和更复杂的事情。

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