如何有效地用视图模型代替域模型的使用
本文关键字:模型 视图 有效地 | 更新日期: 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的起点来欺骗。有很多方法可以使这个过程快速。