Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何替换域';通过视图模型有效地减少模型的使用_C#_Asp.net Mvc_Asp.net Mvc 3 - Fatal编程技术网

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");
}