星期五, 11月 27, 2009

asp.net 使用多個以上的sitemap

由於使用sitemap可以快速建立menu選單,
又可以加上securityTrimmingEnabled="true"來依成員角色顯示不同的選單,
但是用了這個安全機制又會讓網站的選單空空的,
所以就不加上這個屬性,
改用二個sitemap檔案來自動切換(二個sitemap的節點數不一樣)

以下是web.config

<!--
sitemap角色權限讀取 securityTrimmingEnabled="true"
-->
<siteMap defaultProvider="XmlSiteMapProvider" enabled="true">
<providers>

<add name="XmlSiteMapProvider" description="未登入與登入"
type="System.Web.XmlSiteMapProvider,System.Web,Version=2.0.3600.0, Culture= neutral,PublicKeyToken=b03f5f7f11d50a3a"
siteMapFile="common-map.sitemap" securityTrimmingEnabled="false" />

<add name=";XmlSiteMapProviderForAdmin" description="登入管理員"
type="System.Web.XmlSiteMapProvider,System.Web,Version=2.0.3600.0, Culture= neutral,PublicKeyToken=b03f5f7f11d50a3a"
siteMapFile="admin-map.sitemap" securityTrimmingEnabled="false" />

</providers>
</siteMap>


由於管理者與未登入及登入會員的頁面都是使用不同的master page,
於是就新增一個繼承System.Web.UI.MasterPage的 BaseMaster物件

///
/// BaseMaster 的摘要描述
///

public class BaseMaster : System.Web.UI.MasterPage
{
public BaseMaster()
{
//
// TODO: 在此加入建構函式的程式碼
//
}
///
/// 切換不同的sitemap
///

///
///
public string SitemapHelper(string username)
{
string provider = "XmlSiteMapProvider";
string[] roleTmp = System.Web.Security.Roles.GetRolesForUser(username);
for (int i = 0; i < roleTmp.Length; i++)
{
if (roleTmp[i] == "Admin")
{
provider = "XmlSiteMapProviderForAdmin";
break;
}
}
return provider;
}
}


接著在網站內master加入以下code,
透過 this.SiteMapDataSource1.SiteMapProvider切換不同的SiteMapProvider

public partial class guest_mp : BaseMaster
{
protected void Page_Load(object sender, EventArgs e)
{
if (this.Page.User.Identity.IsAuthenticated)
{
if (!IsPostBack)
{
this.SiteMapDataSource1.SiteMapProvider = this.SitemapHelper(this.Page.User.Identity.Name);
}
}
}
}

沒有留言:

張貼留言

留個話吧:)