C# 如何替换域';通过视图模型有效地减少模型的使用
我一直认为直接使用域模型作为视图的参数是不好的做法。但这样做似乎过于复杂且容易出错。例如: 以下是编辑C# 如何替换域';通过视图模型有效地减少模型的使用,c#,asp.net-mvc,asp.net-mvc-3,C#,Asp.net Mvc,Asp.net Mvc 3,我一直认为直接使用域模型作为视图的参数是不好的做法。但这样做似乎过于复杂且容易出错。例如: 以下是编辑ItemViewModel的视图: @model ItemViewModel @using (Html.BeginForm()) { <p>@Html.ValidationSummary()</p> @Html.LabelFor(o => o.ItemId) : @Html.EditorFor(o => o.ItemId)
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)
}
这意味着我必须再次将Item
转换为ItemViewModel
转换为Item
。如果我将一个新属性添加到项
中,而我忘记将其添加到转换中,那么我将以未保存的更改结束
你是这样做的还是我错过了什么?有几件事。我将从Item到ItemModel再到Item进行转换,正如您在上面查询的那样。然后创建另一个名为SomethingRelevantViewModel的类,该类将ItemModel作为属性,并且是视图的@model。然后,您可以将许多不同的SomeThingModel附加到视图或SomeThingsModel列表中,用于下拉列表、网格等 ItemModel的真正魔力在于添加DataAnnotation,因为您使用的是LabelFor,所以看起来您可能正在使用DataAnnotation。您还可以使用DataAnnotation处理所需和更复杂的事情
我们经常使用数据优先实体框架,并通过复制粘贴T4自动生成的类作为Something模型的起点来作弊。有很多方法可以加快这个过程。有几件事。我将从Item到ItemModel再到Item进行转换,正如您在上面查询的那样。然后创建另一个名为SomethingRelevantViewModel的类,该类将ItemModel作为属性,并且是视图的@model。然后,您可以将许多不同的SomeThingModel附加到视图或SomeThingsModel列表中,用于下拉列表、网格等 ItemModel的真正魔力在于添加DataAnnotation,因为您使用的是LabelFor,所以看起来您可能正在使用DataAnnotation。您还可以使用DataAnnotation处理所需和更复杂的事情
我们经常使用数据优先实体框架,并通过复制粘贴T4自动生成的类作为Something模型的起点来作弊。有很多方法可以加快这个过程。简而言之,就是这样。如果你愿意的话,你可以研究或做类似的事情,或者编写自己的映射扩展方法。简而言之,就是这样。如果您愿意的话,您可以研究或做类似的事情,或者编写自己的映射扩展方法。
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");
}