使用基本控制器获取Common ViewData

时间:2008-12-03 00:45:34

标签: asp.net asp.net-mvc

我正在开发一个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?

5 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

public static HtmlString MainMenu(this HtmlHelper helper)

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

几个月前,我处理了类似的设计挑战 - 实现了一个随着用户在页面之间导航而改变的痕迹导航功能。

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

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

答案 4 :(得分:0)

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