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