ASP.NET MVC SiteMap provider的一個bug

來源:互聯網
上載者:User

前幾天簡單研究了一下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即可。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.