ASP.NET MVC SiteMap provider的一个bug
前几天简单研究了一下mvc中的sitemap provider(点击查看),今天应用到了实际的项目中,碰到了些小麻烦。配置的导航菜单没有显示出来,经过查看源码,折腾了一个多小时后,发现是框架中的一个小小的失误。
框架默认提供的DefaultAclModule类,是用于控制用户能否访问配置的菜单,通过是否能访问来设置是否显示在页面中,即最终是否生成内容。经过调试发现,DefaultAclModule中还包含了一个AuthorizeAttributeAclModule类,是这个module真正执行了判断用户是否有权限访问菜单的逻辑。然而这个逻辑执行得有些早,比如在用户没有登录之前就执行了,通常是首次请求初始化sitemap的时候执行,而这时用户尚未登录,因此不生成任何菜单项。而之后的请求都是从缓存中读取,那么即使登录之后,还是不能显示菜单,因为在初始化时没有生成。对于这个逻辑,估计有作者自身的考虑,但对于实际项目来说,确实不符合逻辑。
不过,作者也提供了扩展的该功能的地方,在配置文件中可设置自定义的aclModule。个人认为对于sitemap没必要牵涉到权限中去,权限控制由Authorize Filter处理即可。因此为了项目能正常跑出来,我自定义了一个空的aclModule,仅简单地返回true,定义以及配置如下:
EmptyAclModule
public class EmptyAclModule : IAclModule
{
#region IAclModule 成员
public bool IsAccessibleToUser(IControllerTypeResolver controllerTypeResolver, MvcSiteMapProvider.DefaultSiteMapProvider provider, HttpContext context, SiteMapNode node)
{
return true;
}
#endregion
}
{
#region IAclModule 成员
public bool IsAccessibleToUser(IControllerTypeResolver controllerTypeResolver, MvcSiteMapProvider.DefaultSiteMapProvider provider, HttpContext context, SiteMapNode node)
{
return true;
}
#endregion
}
然后将siteMap中的aclModule设置为EmptyAclModule即可。