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

Should I always use a view model or is it ok to use ViewData?

您认为什么时候使用 ViewData 而不是视图模型更好?

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

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

通过查看数据,我可以像这样简单地传递要求详细信息:

@{
    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 在我的项目中有很多不同的变化,因为创建/编辑、列表、记录记录细节等的模型不同。我觉得它可能开始如果我为每个动作制作视图模型,我的项目会太乱。

你怎么看。请你就那个特定问题提出建议。谢谢

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

我的理由是,在长期 运行 中,它将更易于维护。当使用 ViewBag 时,它是 dynamic class 所以在你看来你应该检查 ViewBag 属性 是否存在(并且可能导致愚蠢的错误,如打字错误)例如:

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

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

你也将最终(如果你使用 ViewBag)试图在某个时候维护它并挣扎。您正在删除 C# 的一个优点,它是一种强类型语言! ViewBag 不是强类型,您可能认为您传递的是 List<T>,但您可能只是传递了 string

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

I feel like it may start to be too messy in my project if I make view model for each action.

在您的控制器中将所有内容分配给 ViewBag 会不会很混乱?如果它是 ViewModel,您可以将它发送到 'Mapping' class 以将您的 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);

*你显然需要为映射 class 提供一个实现,看看像 Automapper

这样的东西

I'd also prefer the partial view to accept only a view model which is a collection of records, just a pure IEnumerable<> object. I'd rather avoid to send the full view model object from a main view because it also contains a lot of different properties, objects, that control paging, sorting, filtering etc.

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