【问题标题】:ASP.NET MVC 2 - Set ViewData on every request in specific area (without inheritance)ASP.NET MVC 2 - 在特定区域的每个请求上设置 ViewData(无继承)
【发布时间】:2011-03-31 13:21:08
【问题描述】:

在我的应用程序的“管理”区域中,每个页面上的ViewData 中都必须有一个可用的对象(以便在主模板中显示)。我已经继承自Controller,所以我无法创建一个简单的基类来处理它。不使用继承时这样做的好解决方案是什么? ActionFilter 看起来很有趣,但我不想把它放在管理区域的每个控制器上。我正在考虑以下几点:

  • 同时检测区域的自定义 ControllerFactory
  • Application_BeginRequest(),虽然当时我不知道如何执行控制器。

也许你有更好的解决方案?

【问题讨论】:

  • 是什么样的数据?也许 Html.RenderAction() 是更好的解决方案?
  • 是当前登录的用户,所以对数据库和IPrincipal都有依赖。
  • 好的,我明白了。那么我可能会使用 Html.RenderAction() 。在我看来,这是最干净的解决方案。
  • 是的,这样做似乎很简单,而不是使用 ControllerFactory。如果您发布答案,我会感谢您。钉! ;)

标签: asp.net-mvc-2


【解决方案1】:

在这种情况下,我将创建一个单独的操作来执行显示您需要的数据的局部视图。在我看来,这是解决此类问题的最干净的解决方案,并且易于测试和重复使用。

【讨论】:

    【解决方案2】:

    我的母版页上有一个下拉菜单。你不需要它的视图数据。我是这样做的

    母版页上的代码:

    <%= Html.DropDownList("schselectr", MVC2_NASTEST.MvcApplication.masterSchooljaarList())%>
    

    在 Global.asax.cs 中

        public static SelectList masterSchooljaarList() {
            NASDataContext _db = new NASDataContext();
            List<Schooljaar> newlist = _db.Schooljaars.ToList();
            return new SelectList(_db.Schooljaars.ToList(), "Sch_Schooljaar", "Sch_Schooljaar");
        }
    

    很简单,每次加载页面时,它都会调用返回我需要的数据的方法。简单、干净、有效。

    【讨论】:

    • 我刚刚评论说数据对象是当前登录的用户,因此对数据库和IPrincipal都有依赖关系。无论如何,在这样的测试友好框架中创建静态上下文并不是一个好的解决方案。但是当然感谢您的回答!
    • 你不能用它发送 IPrincipal 吗?
    • 你不想这样做的原因是因为它违反了很多设计模式(包括mvc)并且很难测试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-08
    • 2016-08-27
    • 2011-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多