【问题标题】:Should ViewData never be used?永远不要使用 ViewData 吗?
【发布时间】:2011-01-14 22:23:33
【问题描述】:

我尝试检查使用 asp.net mvc 的最佳实践,并且很多人说我们永远不应该使用 ViewData。我已经读过这个post 并且看起来是这样的。

我能想到使用 ViewData 的一个原因是,如果您只想将一个值传递给视图。但是对于多个值,使用 ViewModel 似乎会更好。但是,如果将它们作为框架的一部分包含在内,那么它们应该具有一些优势和好处。

什么情况下我应该使用 ViewData ?使用 ViewData 时应遵循哪些最佳实践,以免被滥用?

【问题讨论】:

    标签: c# asp.net-mvc-2 viewdata


    【解决方案1】:

    我更喜欢从一开始就使用强类型视图模型。 我更喜欢这样做没有“魔术字符串”。

    对于所有情况,从来没有一个规则,但这通常是我采取的第一种方法。

    【讨论】:

    • 魔术字符串本身可以通过使用常量字符串来避免......只是说......
    【解决方案2】:

    引自 Scot Gu(链接至来源:nerddinnerbook

    使用基于字符串的字典,因为 错别字,可能会导致不会出现的错误 在编译时被捕获。这 无类型的 ViewData 字典也 需要使用“as”运算符或 使用强类型时进行强制转换 视图模板中的 C# 等语言。

    【讨论】:

      【解决方案3】:

      将强类型 ViewPages 与强类型 Model 或 ModelView 结合使用是 ASP.NET MVC 的完美实践。

      您可以使用 ViewData 将其他数据传输到 ViewPage,但我更喜欢 ViewModel,因为:

      1. 编译时错误与运行时错误
      2. IntellySence 支持
      3. 轻松重构
      4. 没有魔线
      5. 使用数据绑定构造表单的 Html 助手

      【讨论】:

        【解决方案4】:

        我不喜欢使用它们,但我发现它们在我想在所有页面上向用户显示某种消息的情况下很有用。例如,我有一个向用户显示消息的用户控件。它也出现在我的母版页中。它检查ViewData["messages"]TempData["messages"] 如果其中一个不为空,它会显示存在的消息。如果它们都为空,则不是。

        这让我的所有模型都不必从具有 Messages 属性的基类继承,并为我提供了更大的灵活性。

        【讨论】:

          【解决方案5】:

          当我需要通过一些基本控制器或过滤器将数据附加到当前请求时,我经常发现自己使用 ViewData。通常,母版页将具有必须从服务器检索的动态内容,而不是修改视图返回的模型,或者将返回的每个模型包装在父 ViewModel 中,我可以简单地将附加数据放在 ViewData 中。

          为了避免在我的视图中使用字符串,我通常会在控制器类或类似类中放置一个 const 字段并在视图中调用该字段。

          public abstract partial class BaseController : Controller
          {
              public const string MessagesViewDataKey = "Base.Messages";
          
              protected override void OnActionExecuted(ActionExecutedContext filterContext) {
                  if (filterContext != null && filterContext.Controller != null && !filterContext.IsChildAction) {
                      filterContext.Controller.ViewData[MessagesViewDataKey] = Messenger.MessageQueues;
                  }
          
                  base.OnActionExecuted(filterContext);
              }
          }
          
          // site.master
          <% if (ViewData[BaseController.MessagesViewDataKey] != null)
                     Html.RenderPartial("DisplayTemplates/MessageList", ViewData[BaseController.MessagesViewDataKey]); %>
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-05-17
            • 2021-07-12
            • 1970-01-01
            • 1970-01-01
            • 2011-03-21
            • 1970-01-01
            • 2015-12-19
            • 2013-01-02
            相关资源
            最近更新 更多