我一直认为直接使用域模型作为视图的参数是不好的做法。但是,否则看起来过于复杂且容易出错。例如:
以下是修改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
添加新属性而忘记将其添加到转换中,我将最终得到未保存的更改。
这是你怎么做的,还是我错过了什么?
答案 0 :(得分:1)
有几件事。我会将Item从Item转换为ItemModel,如上所述。然后有另一个名为SomethingRelevantViewModel的类,它将ItemModel作为属性,并且是View的@model。然后你可以基本上将许多不同的SomethingModels附加到一个视图或者DropDowns,Grids等的SomethingsModels列表。
当您添加DataAnnotations时,您的ItemModel的真正神奇之处在于,您可能正在使用它,因为您正在使用LabelFor。您还可以将DataAnnotations用于所需的和更复杂的事情。
我们经常使用数据第一个实体框架,并通过将T4自动生成的类复制粘贴作为SomethingModel的起点来作弊。有很多方法可以快速完成这个过程。