Asp.net mvc 为我的ASP.NET MVC母版页中的菜单提供数据

Asp.net mvc 为我的ASP.NET MVC母版页中的菜单提供数据,asp.net-mvc,Asp.net Mvc,我们正在开始为所有新的应用程序从Web表单转移到MVC的过程。我正在努力移植我们的母版页,并试图满足我们需要一个母版页供所有应用程序使用的要求。应用程序的主导航需要位于母版页内的菜单中。实现这一点很容易,但困难的是每个应用程序可能需要使用一组独特的规则来确定菜单中显示的内容。有些应用程序可以简单地说,这是通过网站地图之类的东西使用的菜单结构。其他人需要根据用户的角色确定菜单中显示的内容,这也可以通过站点地图轻松处理。我所面临的情况是,一些应用程序需要根据用户所扮演的角色生成菜单,但也需要根据用户

我们正在开始为所有新的应用程序从Web表单转移到MVC的过程。我正在努力移植我们的母版页,并试图满足我们需要一个母版页供所有应用程序使用的要求。应用程序的主导航需要位于母版页内的菜单中。实现这一点很容易,但困难的是每个应用程序可能需要使用一组独特的规则来确定菜单中显示的内容。有些应用程序可以简单地说,这是通过网站地图之类的东西使用的菜单结构。其他人需要根据用户的角色确定菜单中显示的内容,这也可以通过站点地图轻松处理。我所面临的情况是,一些应用程序需要根据用户所扮演的角色生成菜单,但也需要根据用户所处理的数据生成菜单。i、 e.同一用户在处理对象“foo”时,在页面菜单中的选项可能与处理对象“bar”时不同

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

到目前为止,这个解决方案似乎运行良好,只是因为某些原因,它“感觉”不正确。我希望我能找到一些更好的方法,或者确信这是解决这个问题的有效方法

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


您可以在apress.com上下载源代码,这样可能会有所帮助。

如果每个页面都会出现源代码,请执行以下操作:

创建基本控制器:

public class MyBaseController : Controller
让此控制器获取所需的数据,并将ViewData[“菜单”]中的数据发送到视图。然后让您的所有控制器从该控制器继承:

public class HomeController : MyBaseController
在母版页中,循环查看ViewData并创建菜单


(我为显示类别列表的子菜单做了类似的操作。)

只是想说明,鉴于每个页面/操作可能需要操纵菜单的场景,这可能是我所知的最佳解决方案。(否则,我认为Html.RenderAction更有意义,但只有当菜单由更静态的东西定义时,比如用户角色,并且每页不改变)我考虑创建一个基本控制器,但由于每个页面/操作可能需要不同的菜单源,如果每个页面/动作都会指定一个新的菜单,那么创建一个基本控制器,使用一个方法获取控制器和动作,然后让它吐出ViewData。