代码之家  ›  专栏  ›  技术社区  ›  x__dos

为什么每个人都讨厌viewdata?

  •  9
  • x__dos  · 技术社区  · 15 年前

    我想知道,为什么每个人 hates 查看数据这么多?
    我觉得它非常有用和方便。我告诉你原因:通常每个控制器操作都有它自己的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 %>
    

    当我需要添加一些数据到视图中时,编写控制器操作不必切换到另一个类。 和A 大加 对我来说:不要用毫无意义的类淹没你的项目,在它们和其他类之间切换。
    我同意使用“magic strings”可能会导致编译器无法捕获的错误,但这些错误局限在很小的代码部分,可以很快发现。此外,你认为那些使用动态语言(Rails、Django)的人生活中根本没有强大的打字能力吗?

    你对使用viewdata有什么看法?

    3 回复  |  直到 15 年前
        1
  •  8
  •   amurra    15 年前

    我认为这不仅仅是魔术字符串的论点。我会争辩说,视图模型是一件好事,而不是毫无意义的类,因为它们有助于保持视图干净,比访问整个视图中的视图数据更容易阅读。

    当您到达需要在视图中显示的五、十、二十个数据块时,您真的要将所有这些数据作为视图数据传递吗?这将使您的视图更难理解,而且数据没有任何意义。创建一个viewModel并将视图强输入到该viewModel不仅使代码更容易阅读,而且您不必在代码中到处强制转换viewData对象。

    我确实认为viewdata对于某些情况是好的,但是在我看来,当你处理大量数据时,它很容易被滥用。

        2
  •  5
  •   Robert Harvey    15 年前

    威尔…

    你为什么不这样写课?

    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

        3
  •  1
  •   ARM    15 年前

    首先,Awesome+1让我知道MVC3如何处理VIEWDATA!我一直想在MVC2中找到一种类似的方法。
    为什么viewdata不好?我不认为它是因为它使用得太少,并且在预期中被测试。使用ViewData有两个主要难点:

    1)如果不包含viewdata,则会导致在编译器未捕获的视图上出现异常。我已经帮助自己解决了这个问题,不使用高度保险的t4mvc模板(尽管我确实推荐它),而是“写”类似的东西:

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

    使用这个,当我返回这个.view(viewconstants.home.index)时,我的intellisense会给我一个提示;如果我知道足够的t4来更改t4mvc,我会切换回生成它;)

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

    <%: ViewData[ViewDataConstants.Message] %>
    

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