您认为何时在视图模型上使用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
在我的项目中有很多不同的变化,因为有不同的模型用于创建/编辑,列出,显示记录的细节等等。我觉得它可能也开始变得太多了如果我为每个动作制作视图模型,那么我的项目就会混乱。
你怎么看?请问您能否就这一特定问题提出建议。感谢
答案 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
。