Asp.net MVC动态菜单系统

时间:2009-11-11 14:26:34

标签: asp.net-mvc asp.net-mvc-2

在我们当前的Asp.net MVC应用程序中,我们有两个菜单系统,一个位于顶部,一个位于左侧。现在我们有一个部分视图来呈现菜单,但是这也是唯一能让每个ViewModel返回菜单项的方法吗?我们试图不使用ViewData字典。

我认为答案是肯定的,但我希望看到别人的想法

7 个答案:

答案 0 :(得分:3)

除了使用主视图模型之外,如果要为菜单配置自己的控制器等,可以使用MVC Future's库中的“渲染操作”。

答案 1 :(得分:3)

3个选项:

  1. RenderAction一路。

  2. Ryan回答RenderPartial。

  3. 一个抽象的MasterViewModel例如。你所有的模型都将继承自己。由动作过滤器填充。

答案 2 :(得分:3)

您使用的是基本控制器吗?我发现使用一个,并重写OnActionExecuting方法帮助我有一个中心位置来保持我所有常见的页面逻辑。

答案 3 :(得分:1)

您基本上有两个选择:

  1. 使用ViewModel设置要显示的菜单项,可以从任何视图(全部或部分)访问它们。

  2. 创建强类型模型的层次结构,将菜单项放在BaseModel的某处,然后将出现在每个派生模型中。

  3. 您可能感兴趣的是异步控制器或部分请求。它没有在ASP.NET MVC中实现,但您可以检查MVC Contrib社区项目,它有一些支持。

答案 4 :(得分:0)

有很多选项可以解决这个问题,但我们发现有一种非常简单的方法可以解决这个问题,而不需要重新构建整个应用程序。

我们遇到过类似的问题,我们的page / partial有一个定义良好的ViewData.Model类型,但是该视图包含一个在多个页面中重复使用的部分。我们也试图避免使用ViewDataDictionary。

但是,我们发现您描述的情况恰好是我们喜欢使用ViewDataDictionary条目的精确场景。我们在应用程序模型中保留一个静态Constants类,它包含每种类型常量的内部类,包括ViewData键,这样我们就没有字符串可以将这些东西浮动到任何地方。

然后,我们的Controller操作填充ViewData键,其他页面/部分内部的部分检查是否存在该键,并使用它而不是ViewData.Model。它可以在任何需要的地方进行部分工作,并保持ViewModel的清洁。通过使用常量,我们可以避免在任何地方使用原始字符串。

答案 5 :(得分:0)

使用ActionFilter使用您需要的菜单信息填充ViewData。仅将其应用于类和/或方法(如果在任何地方需要,可能在基本Controller类上)。在Controller上创建一些扩展方法,使得从ViewData访问数据的方式是强类型的(如果您稍后更改其存储位置,则会透明)。

我最近使用类似方法做了a blog post(我需要在每个页面上显示赞助商列表)。它可能有助于指明您正确的方向。

答案 6 :(得分:0)

为了补充一点,RenderAction被添加到MVC2 Beta中。