【问题标题】:Using a Base Controller for obtaining Common ViewData使用 Base Controller 获取 Common ViewData
【发布时间】:2008-12-03 00:45:33
【问题描述】:

我正在开发一个 ASP.NET MVC 应用程序,该应用程序在每个页面上都包含一个标题和菜单。菜单和标题是动态的。换句话说,菜单项和标题信息是在运行时确定的。

我最初的想法是构建一个基础控制器,所有其他控制器都从中派生。在基本控制器中,我将获取菜单和标题数据并将所需的信息插入到 ViewData 中。最后,我将使用 ViewUserControl 通过母版页模板显示标题和菜单。

因此,我正在尝试确定构建此类功能的最佳实践。此外,如果这是推荐的方法,那么在获取要插入 ViewData 的数据时,我应该重写哪个方法(我猜是 Execute)。

我确定这是一种常见情况,因此我们将不胜感激任何建议/最佳做法!提前致谢!

编辑: 发布后我确实找到了以下资源(当然),但任何额外的轶事都会很棒!

http://www.singingeels.com/Blogs/Nullable/2008/08/14/How_to_Handle_Side_Content_in_ASPNET_MVC.aspx

How do you use usercontrols in asp.net mvc that display an "island" of data?

【问题讨论】:

    标签: asp.net asp.net-mvc


    【解决方案1】:

    取决于您的信息来自哪里。我们有标准的视图数据,我们使用这些数据来生成我们在屏幕上以这种方式创建的一些信息。它运行良好且易于维护。 We override the View method to implement strongly typed view names 并使用此信息来检索母版页所需的一些数据。

    【讨论】:

    • 这是一个非常棒的技术。 +1 亿万
    【解决方案2】:

    您可以编写一个辅助扩展来呈现标题/菜单 这样,您可以在需要时将其显示在视图中的不同位置,但只在一个位置进行维护。

    public static HtmlString MainMenu(this HtmlHelper helper)
    

    【讨论】:

      【解决方案3】:

      使用基本控制器类来实现通用过滤器方法。控制器类实现了一些过滤器接口 IActionFilter、IAuthorizationFilter、IExceptionFilter 和 IResultFilter,它们对于实现所有控制器的一些通用行为很有用。

      如果所有页面上的菜单数据相同,但每个唯一用户的菜单数据不同。
      在控制器基类的OnAuthorizationInitialize 方法中生成菜单数据。首先将在授权时调用。 Initialize 将在每个操作方法之前调用。您可以访问 ViewData 上下文。在那里生成菜单数据。 将 menu 和 header 的视图内容放入母版页并在那里访问生成的 ViewData。

      【讨论】:

        【解决方案4】:

        几个月前我解决了一个类似的设计挑战 - 实现一个面包屑导航功能,该功能会随着用户从一个页面导航到另一个页面而变化。

        我重写了OnActionExecuting 方法来收集面包屑并将它们存储在ViewData 中(我使用动作的名称作为视图的面包屑)。然后我更新了母版页以包含一个用户控件,该控件采用ViewData 并呈现面包屑。

        需要注意的一点是,如果您使用默认的 ASP.NET MVC 错误处理属性 [HandleError],并且您的错误页面使用的是尝试读取 ViewData 的同一母版页,您很快就会发现您无法从错误页面访问ViewData,它会引发异常。根据您是否需要 ViewData 来解决故障情况,可行的解决方案是使用单独的母版页或执行以下操作:How do I pass ViewData to a HandleError View?

        【讨论】:

          【解决方案5】:

          我会用另一个问题来回答你的问题。基本控制器是否必须确定它真正的类型才能生成正确的菜单数据?如果是这样,那么您就违背了多态性的目的,并且生成数据的代码应该放在每个控制器中,如果菜单对于所有操作都相同,则可能在 OnActionExecuting 中。将其推回父类似乎最终会导致父类中的一些 switch 语句执行每个派生控制器真正应该处理的事情。

          【讨论】:

          • 菜单数据在所有页面上都是相同的,但对于每个唯一用户来说是不同的。
          猜你喜欢
          • 1970-01-01
          • 2018-01-18
          • 2018-05-26
          • 1970-01-01
          • 1970-01-01
          • 2020-05-01
          • 2021-07-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多