C# 是否永远不要使用ViewData?

C# 是否永远不要使用ViewData?,c#,asp.net-mvc-2,viewdata,C#,Asp.net Mvc 2,Viewdata,我曾尝试检查使用asp.net mvc的最佳实践,很多人说我们不应该使用ViewData。我读过这篇文章,好像是从那篇文章开始的 我可以考虑使用ViewData的一个原因是,如果您希望只向视图传递一个值,但对于多个值,似乎最好使用ViewModels。但是,如果将它们作为框架的一部分,那么它们应该具有一些优势和好处 我应该在哪些情况下使用ViewData?使用ViewData时应遵循哪些最佳实践,以避免其被误用?我更喜欢从一开始就使用强类型视图模型。 我更喜欢这样做以避免“魔弦”的出现 从来没有

我曾尝试检查使用asp.net mvc的最佳实践,很多人说我们不应该使用ViewData。我读过这篇文章,好像是从那篇文章开始的

我可以考虑使用ViewData的一个原因是,如果您希望只向视图传递一个值,但对于多个值,似乎最好使用ViewModels。但是,如果将它们作为框架的一部分,那么它们应该具有一些优势和好处


我应该在哪些情况下使用ViewData?使用ViewData时应遵循哪些最佳实践,以避免其被误用?

我更喜欢从一开始就使用强类型视图模型。 我更喜欢这样做以避免“魔弦”的出现

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

引用Scot Gu的话(链接到来源:)

使用基于字符串的词典,因为 拼写错误,可能会导致错误,但不会 在编译时被捕获。这个 未类型化的ViewData字典 需要使用“as”运算符或 使用强类型时强制转换 视图模板中类似C#的语言


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

您可以使用ViewData将其他数据传输到ViewPage,但我会优先选择ViewModels,因为:

  • 编译时错误与运行时错误
  • 智力支持
  • 易于重构
  • 没有魔术弦
  • 使用数据绑定构造表单的Html帮助程序

  • 当我需要通过一些基本控制器或过滤器将数据附加到当前请求时,我经常使用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]); %>
    
    公共抽象部分类BaseController:控制器
    {
    public const string MessagesViewDataKey=“Base.Messages”;
    受保护的覆盖无效OnActionExecuted(ActionExecutedContext筛选器上下文){
    if(filterContext!=null&&filterContext.Controller!=null&&filterContext.IsChildAction){
    filterContext.Controller.ViewData[MessagesViewDataKey]=Messenger.MessageQueues;
    }
    base.OnActionExecuted(filterContext);
    }
    }
    //site.master
    
    我不喜欢使用它们,但在我希望在所有页面上向用户显示某种消息的情况下,我发现它们很有用。例如,我有一个向用户显示消息的用户控件。它也出现在我的母版页中。它检查
    ViewData[“messages”]
    TempData[“messages”]
    ,如果其中一个不为空,则显示存在的消息。如果它们都为空,则不为空


    这使我不必从具有Messages属性的基类继承所有模型,并使我具有更大的灵活性。

    使用常量字符串可以避免使用魔术字符串本身。。只是说。。