zoukankan      html  css  js  c++  java
  • 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
        }

    然后将siteMap中的aclModule设置为EmptyAclModule即可。

  • 相关阅读:
    proxmox新版本使用了lxc容器,导致以前的vzlist命令无法使用,于是自己写了一个脚本来获取所有半虚拟化主机的信息状态
    Linux 系统优化参数总结
    linux shell 远程执行命令
    wios设置证书登陆
    Eclipse安装tomcat插件
    Centos6.5-dnsmasq安装
    SSL工作原理
    ssh免密码登陆及其原理
    Linux查看后台任务,关闭后台任务
    Mybatis 中常用的java类型与jdbc类型
  • 原文地址:https://www.cnblogs.com/shenba/p/1868557.html
Copyright © 2011-2022 走看看