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

时间:2013-02-28 19:09:49

标签: 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)      
    @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转换为ItemViewModelItem。如果我向Item添加新属性而忘记将其添加到转换中,我将最终得到未保存的更改。

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

1 个答案:

答案 0 :(得分:1)

有几件事。我会将Item从Item转换为ItemModel,如上所述。然后有另一个名为SomethingRelevantViewModel的类,它将ItemModel作为属性,并且是View的@model。然后你可以基本上将许多不同的SomethingModels附加到一个视图或者DropDowns,Grids等的SomethingsModels列表。

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

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