我应该始终使用视图模型还是可以使用ViewData?

时间:2015-07-27 07:46:30

标签: asp.net-mvc viewdata

您认为何时在视图模型上使用ViewData会更好?

我在几个主要视图中有相同的部分视图。我想控制部分视图的呈现方式,但我也希望局部视图只接受视图模型,它是一个记录集合,只是一个纯IEnumerable<>对象。我宁愿避免从主视图发送完整视图模型对象,因为它还包含许多不同的属性,对象,控制分页,排序,过滤等。

因此问题是我是否应该为局部视图创建另一个视图模型,或者是否可以使用ViewData?我已经阅读过使用ViewData这是一个非常糟糕的做法。

使用View Data,我可以直接传递需要的详细信息:

@{
    ViewDataDictionary vd = new ViewDataDictionary
    {
        new KeyValuePair<string,object>("WithDelete", Model.WithDelete),
        new KeyValuePair<string,object>("WithRadarCode", Model.WithCode)
    };
}

// ...

@if (Model != null) {
    Html.RenderPartial("_ListOfRecordingsToRender", Model.recordingViewModel, vd);
}

目前,它将被整理出来。

我担心的是,目前这个*.recordingViewModel在我的项目中有很多不同的变化,因为有不同的模型用于创建/编辑,列出,显示记录的细节等等。我觉得它可能也开始变得太多了如果我为每个动作制作视图模型,那么我的项目就会混乱。

你怎么看?请问您能否就这一特定问题提出建议。感谢

1 个答案:

答案 0 :(得分:5)

我认为您应该坚持使用ViewModel,您的ViewModel是定义视图要求的类。

我背后的原因是,从长远来看,它将更加可维护。在ViewBag使用dynamic类时,在您的视图中,您应该检查ViewBag属性是否存在(并且可能导致像拼写错误这样的愚蠢错误),例如:

if(ViewBag.PropertyName != null)
{
    // ViewBag.PropertyName is a different property to ViewBag.propertyName
}

此类代码可能会使您的View非常混乱。如果您使用强类型模型,您应该能够将大部分逻辑放在控制器中,并尽可能保持视图干净,这在我的书中是一个巨大的优势。

你也将最终(如果你使用ViewBag)试图在某个时刻维持它并且努力。你正在删除一个关于C#的好东西,它是一种强类型语言! ViewBag不是强类型的,你可能认为你传递的是List<T>,但你可能只是传递string

最后一点,您也将失去Visual Studio中的任何智能感知功能。

  

如果我为每个动作制作视图模型,我觉得我的项目可能会开始变得太乱。

在你的控制器中将所有内容分配给ViewBag时,它会不会那么混乱?如果是ViewModel,您可以将其发送给“映射”。将您的DTO映射到您的视图的课程。

而不是:

// ViewModel
var model = new CustomViewModel()
{
    PropertyOne = result.FirstResult,
    PropertyTwo = result.SecondResult,
}
//ViewBag
ViewBag.PropertyOne = result.FirstResult;
ViewBag.PropertyTwo = result.SecondResult;

你可以这样做:

var mapper = new Map();
var model = mapper.MapToViewModel(result);

*您显然需要提供映射类的实现,看看类似Automapper

的内容
  

我还希望局部视图只接受一个视图模型,它是一个记录集合,只是一个纯IEnumerable&lt;&gt;宾语。我宁愿避免从主视图发送完整视图模型对象,因为它还包含许多不同的属性,对象,控制分页,排序,过滤等。

没关系,只需创建一个属性为IEnumerable<T>的视图模型。在我看来,您应该尝试在所有场景中使用强类型ViewModel