为什么每个人都讨厌ViewData?

kil*_*net 9 asp.net asp.net-mvc

我想知道,为什么每个人都非常讨厌 ViewData?
我发现它非常有用和方便.我告诉你原因:通常每个控制器动作都有它自己的ViewModel,因此它只使用一次,我发现每次我需要添加额外的数据部分来修改ViewData类时非常繁琐(向类中添加额外的字段通常会导致修改它的构造函数).相反,我可以写入控制器

ViewData["label"] = someValue;
// in mvc 3 even better:
ViewData.Label = someValue
Run Code Online (Sandbox Code Playgroud)

在视野中

<%= ViewData["label"] %>
<%-- mvc 3: --%>
<%= ViewData.Label %>
Run Code Online (Sandbox Code Playgroud)

或者对于复杂类型:

<% ComplexType t = (ComplexType)ViewData["label"]; %> // and use all benefits of strong typing 
<%= t.SomeProperty %>
Run Code Online (Sandbox Code Playgroud)

编写控制器操作当我需要添加一些数据来查看时,我不必切换到另一个类.对我来说这是一个很大的好处:不要让你的项目充满无意义的课程,并在他们和其他人之间切换.
我同意使用"魔术字符串"可能导致编译器无法捕获的错误,但这些错误本地化在代码的很小一部分中,并且可以非常快速地发现.此外,您如何看待使用动态语言(rails,django)的人在没有强力打字的情况下生活?)

您对使用ViewData有何看法?

amu*_*rra 8

我认为这不仅仅是魔术字符串参数.我认为ViewModels是一件好事,而不是毫无意义的类,因为它们有助于使视图更清晰,更容易阅读,而不是在整个视图中访问ViewData.

当您获得需要在视图中显示的五个,十个,二十个数据时,您是否真的要将所有数据作为ViewData传递?这将使您的观点更难以遵循,并且数据没有任何意义.创建一个ViewModel并向该ViewModel强烈键入视图不仅会使代码更容易阅读,而且您不必在代码中遍布ViewData对象.

我认为ViewData对某些情况很有用,但是当你处理大量数据时,我认为很容易被滥用.


Rob*_*vey 5

Weeellll .....

你为什么不这样写课?

public dictionary<string, object> myCollectionOfClasses;
myCollectionOfClasses.Add("MyClass", new MyClass);

public class MyClass
{
    public string DoSomething
    {
        return "SomeString";
    }
}
Run Code Online (Sandbox Code Playgroud)

你必须这样打电话给他们:

string myString =  myCollectionOfClasses["MyClass"].DoSomething();
Run Code Online (Sandbox Code Playgroud)

现在哪个更傻?

另请参见
我们如何进行MVC - 查看模型

  • 这只是一种划分应用程序复杂性的便捷方式……如果您愿意,可以分而治之。对我来说,提供 ViewModel 类的一大好处是 1) 记录将在视图中使用的信息,以及 2) 提供放置视图逻辑的地方。你不能用 ViewData 字典做任何一个。是的,我喜欢使用 ViewModel 对象时获得的智能感知。如果看起来工作量很大,您可以使用 Automapper 为您将域模型对象映射到 ViewModel 对象。 (2认同)