为什么每个人都讨厌ViewData?

时间:2010-10-21 13:58:27

标签: asp.net asp.net-mvc

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

ViewData["label"] = someValue;
// in mvc 3 even better:
ViewData.Label = someValue

并在视野中

<%= ViewData["label"] %>
<%-- mvc 3: --%>
<%= ViewData.Label %>

或复杂类型:

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

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

您对使用ViewData有何看法?

3 个答案:

答案 0 :(得分:8)

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

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

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

答案 1 :(得分:5)

Weeellll .....

你为什么不这样写课?

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

public class MyClass
{
    public string DoSomething
    {
        return "SomeString";
    }
}

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

string myString =  myCollectionOfClasses["MyClass"].DoSomething();

现在哪个更傻?

另见
How we do MVC – View models

答案 2 :(得分:1)

首先,让我知道MVC3如何查看数据真棒+1!我一直想找到一些在MVC2中做类似事情的方法。
至于为什么viewdata不好?只要它被稀疏地使用并且在期望中进行测试,我感觉不到它。使用viewdata有两个主要难点:

1)如果未包含viewdata,则会导致视图中出现未被编译器捕获的异常。通过不使用多功能的T4MVC模板(我推荐它)来帮助自己解决这个问题,而是自己“写”类似的东西:

        /// <summary>
        /// Main Greeting
        /// ViewData: ViewDataConstants.Message
        /// </summary>
        public const string Index = "~/Views/Home/Index.aspx";

使用这个,当我返回时,我的intellisense会给我一个抬头.View(ViewConstants.Home.Index);如果我知道足够的T4改变T4MVC为我做这个,我会切换回生成这个;)

2)错别字很痛苦。这就是为什么,正如您将在上面看到的,我不仅为视图名称使用静态类,而且还为viewdata索引器使用静态类。当我使用viewdata时,你会在我的页面中看到这样的代码:

<%: ViewData[ViewDataConstants.Message] %>

如果你可以控制这两个痛点,并将使用率保持在可接受的低水平,那么viewdata有它的好处,不应该被忽视。