ViewData永远不会被使用吗?

时间:2011-01-14 22:23:33

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

我试图检查使用asp.net mvc的最佳做法,不少人说我们永远不应该使用ViewData。我已经阅读了这个post,看起来就好了。

我可以考虑使用ViewData的一个原因是,如果您只想将一个值传递给view.But,对于多个值,似乎最好使用ViewModels。但如果将它们作为框架的一部分包含在内,那么它们应该具有一些优势和好处。

我应该使用ViewData的情况是什么?使用ViewData时应遵循哪些最佳做法,以免误用?

5 个答案:

答案 0 :(得分:3)

我更喜欢从一开始就使用强类型视图模型。 通过这样做,我更喜欢缺乏“魔术弦”。

所有情况从来都不是一条规则,但这通常是我采取的第一种方法。

d

答案 1 :(得分:0)

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

  

使用基于字符串的词典,因为   错别字,可能会导致错误   在编译时被捕获。该   un-typed ViewData字典也   需要使用“as”运算符或   使用强类型时进行铸造   视图模板中的C#语言。

答案 2 :(得分:0)

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

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

  1. 编译时间错误与运行时错误
  2. IntellySence支持
  3. 轻松重构
  4. 没有神奇的字符串
  5. 使用数据绑定构造表单的Html帮助程序

答案 3 :(得分:0)

当我需要通过某个基本控制器或过滤器将数据附加到当前请求时,我经常发现自己使用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]); %>

答案 4 :(得分:0)

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

这使我可以保持所有模型不必从具有Messages属性的基类继承,并为我提供更大的灵活性。