在我的ASP.NET MVC母版页中向Menu提供数据

时间:2009-08-11 15:19:19

标签: asp.net-mvc

我们正在开始为所有新应用程序从Web窗体转移到MVC的过程。我正在努力移植我们的母版页,并且正在努力满足我们需要所有应用程序使用的单个母版页的要求。应用程序的主要导航需要位于母版页的菜单中。实现这一点很容易,困难的是每个应用程序可能需要使用一组独特的规则来确定菜单中显示的内容。有些应用可以简单地说,这是通过类似SiteMap的方式使用的菜单结构。其他人需要根据用户的角色确定菜单中显示的内容,这也可以使用SiteMap轻松处理。我正在努力的情况是,一些应用程序需要根据用户拥有的角色生成菜单,还需要根据他们工作的数据生成菜单。即,对于页面的菜单,如果相同的用户在对象'foo'上工作,那么它们可能在处理对象'bar'时具有不同的选项。

我目前所做的是,我创建了一个HtmlHelper,它由主页面视图调用并获取自定义类型的对象列表,并返回由jQuery插件设置样式的无序列表显示菜单。 helper方法所使用的对象列表将使用ViewData字典传递给视图。目前,此ViewData节点的值是在每个控制器的构造函数中设置的。这允许每个页面以及可能的每个方法设置不同的菜单,而不必在每个操作方法中设置值,除非需要它。我还创建了一个解析SiteMap的类,并返回构建菜单所需的项目列表。这个类是我用来在控​​制器中设置ViewData值的。这个想法是,如果应用程序需要更多地控制菜单数据的生成方式,只要它返回正确类型的对象列表,它们就可以创建自己的类来生成数据。

到目前为止,这个解决方案似乎运行正常,但由于某些原因它并没有'感觉'正确。我希望我能够得到一些更好的方法来做到这一点,或者一些保证,这是解决这个问题的有效方法。

2 个答案:

答案 0 :(得分:1)

如果它出现在每个页面上,请执行以下操作:

创建一个基本控制器:

public class MyBaseController : Controller

让此控制器获取所需的数据,并将ViewData [“menu”]中的数据发送到View。然后让所有控制器继承这一个:

public class HomeController : MyBaseController

在母版页中,循环浏览ViewData并创建菜单。

(我为子菜单做了类似的事情,显示了一个类别列表。)

答案 1 :(得分:0)

在我正在阅读的书(Apress的Pro ASP.NET MVC Framework)中,他们使用Html.RenderAction作为母版页中的菜单。我是Asp.net MVC的新手,所以也许其他人可以提供更多关于此的信息。

您可以在apress.com下载源代码,但也许可以提供帮助。