gpt4 book ai didi

asp.net-mvc - 我应该始终使用 View 模型还是可以使用 ViewData?

转载 作者:行者123 更新时间:2023-12-05 01:20:35 24 4
gpt4 key购买 nike

您认为什么时候使用 ViewData 比使用 View 模型更好?

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

因此问题是我是否应该为局部 View 创建另一个 View 模型或者是否可以使用 ViewData?我读过 soemwhere 使用 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在我的项目中有很多不同的变化,因为创建/编辑、列表、记录记录细节等的模型不同。我觉得如果我为每个 Action 制作 View 模型,我的项目可能会开始变得太乱。

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

最佳答案

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

我的理由是,从长远来看,它将更易于维护。使用 ViewBag 时这是一个dynamic类所以在你看来你应该检查 ViewBag属性存在(并且可能导致像拼写错误这样的愚蠢错误)例如:

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

这种类型的代码会使您的 View 变得非常困惑。如果您使用强类型模型,您应该能够将大部分逻辑放在 Controller 中并尽可能保持 View 干净,这在我看来是一个巨大的优势。

你也会最终(如果你使用 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.

在您的 Controller 中将所有内容分配给 ViewBag 会不会很困惑? ?如果它是 ViewModel您可以将它发送到“映射”类以将您的 DTO 映射到您的 View 。

取而代之的是:

// 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 这样的东西

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> 的 View 模型.在我看来,您应该尝试使用强类型 ViewModel在您的所有场景中。

关于asp.net-mvc - 我应该始终使用 View 模型还是可以使用 ViewData?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31647562/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com