前些天已经实现了该控件,但当时是把所有可能的WebApplication都Hardcode在代码里了。考虑到后续扩展和变更的需要,同时也简化开发和调用,我稍微做了些改动,在控件中只封装一个WebApplication及其下面的SiteCollection。另外,在应用该控件的时候遇到一个棘手的问题,即:浮动菜单遇到select等控件时,层叠顺序不正确。查资料发现这是IE6.0及以下版本的一个Bug。尝试了很久才把问题解决,呵呵,其实很简单,是我太笨!另外,控件集成了MOSS2007的访问权限控制,没有网站访问权限的用户将不会看到该网站的链接项。
<%@ Control Language="C#" ClassName="GlobalNavigator" %>
<%@ Import Namespace="System" %>
<%@ Import Namespace="System.Collections" %>
<%@ Import Namespace="System.Web.UI" %>
<%@ Import Namespace="System.Web.UI.WebControls" %>
<%@ Import Namespace="Microsoft.SharePoint" %>
<%@ Import Namespace="Microsoft.SharePoint.Administration" %>

<script runat="server">

private string webAppName = string.Empty;
private bool visable = true;
private string text = "SP Sites";
private string itemCssClass = string.Empty;
private string menuCssClass = string.Empty;
private string normalCssClass = string.Empty;
private string activeCssClass = string.Empty;
private string mLeaveScript = string.Empty;
private string mEnterScript = string.Empty;
private string mClickScript = string.Empty;

protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
try
{
mLeaveScript = "document.getElementById('{0}').className = '{1}'; document.getElementById('{2}').style.display = 'none';";
mEnterScript = "document.getElementById('{0}').className = '{1}';";
mClickScript = "document.getElementById('{0}').style.display = 'block';";
pnlItem.Attributes.Add("onmouseleave", string.Format(mLeaveScript, lblWebApp.ClientID, normalCssClass, pnlMenuHold.ClientID));
lblWebApp.Attributes.Add("onmouseenter", string.Format(mEnterScript, lblWebApp.ClientID, activeCssClass));
lblWebApp.Attributes.Add("onclick", string.Format(mClickScript, pnlMenuHold.ClientID));

pnlItem.Visible = visable;
pnlItem.CssClass = itemCssClass;
lblWebApp.CssClass = normalCssClass;
lblWebApp.Text = text;
pnlMenu.CssClass = menuCssClass;

dlWebSites.DataSource = GetSiteList(webAppName);
dlWebSites.DataBind();
}
catch (Exception ex)
{
lblWebApp.Text = ex.Message;
}
}
}

public string WebAppName
{
get { return webAppName; }
set { webAppName = value; }
}

public bool Visable
{
get { return visable; }
set { visable = value; }
}

public string Text
{
get { return text; }
set { text = value; }
}

public string ItemCssClass
{
get { return itemCssClass; }
set { itemCssClass = value; }
}

public string MenuCssClass
{
get { return menuCssClass; }
set { menuCssClass = value; }
}

public string NormalCssClass
{
get { return normalCssClass; }
set { normalCssClass = value; }
}

public string ActiveCssClass
{
get { return activeCssClass; }
set { activeCssClass = value; }
}

private ArrayList GetSiteList(string appName)
{
ArrayList siteList = new ArrayList();
SPWebServiceCollection webServices = new SPWebServiceCollection(SPFarm.Local);

foreach (SPWebService webService in webServices)
{
foreach (SPWebApplication webApp in webService.WebApplications)
{
if (webApp.IsAdministrationWebApplication || webApp.Name != appName)
continue;

foreach (SPSite site in webApp.Sites)
{
SPWeb web = null;
SPBasePermissions openRight = SPBasePermissions.Open;
SPBasePermissions viewRight = SPBasePermissions.Open;
SPSecurity.RunWithElevatedPrivileges(delegate()
{
using (SPSite tempSite = new SPSite(site.ID))
{
web = tempSite.RootWeb;
openRight = SPBasePermissions.Open;
viewRight = SPBasePermissions.ViewPages;
}
}
);

string loginName = SPContext.Current.Web.CurrentUser.LoginName;
//siteList.Add(new WebSiteInfo(web.Description, site.Url));
if (web.DoesUserHavePermissions(loginName, SPBasePermissions.Open) && web.DoesUserHavePermissions(loginName, SPBasePermissions.ViewPages))
siteList.Add(new WebSiteInfo((web.Description == string.Empty) ? web.Title : web.Description, site.Url));
}
}
}

return siteList;
}

class WebSiteInfo
{
private string siteTitle;
private string siteUrl;

public WebSiteInfo(string siteTitle, string siteUrl)
{
this.siteTitle = siteTitle;
this.siteUrl = siteUrl;
}

public string SiteTitle
{
get { return siteTitle; }
}

public string SiteUrl
{
get { return siteUrl; }
}
}
</script>

<asp:Panel ID="pnlItem" runat="server">
<asp:Label ID="lblWebApp" runat="server" Text="SP Sites"></asp:Label><br />
<asp:Panel ID="pnlMenuHold" runat="server" Style="display: none; position: absolute;
z-index: 20;">
<iframe style="position: absolute; z-index: -1; filter: alpha(opacity=0);"></iframe>
<asp:Panel ID="pnlMenu" runat="server">
<asp:DataList ID="dlWebSites" runat="server" RepeatLayout="Flow">
<ItemTemplate>
<asp:HyperLink ID="HyperLink1" NavigateUrl='<%# DataBinder.Eval(Container, "DataItem.SiteUrl")%>'
runat="server" Width="100%"><%# DataBinder.Eval(Container, "DataItem.SiteTitle")%></asp:HyperLink>
</ItemTemplate>
</asp:DataList>
</asp:Panel>
</asp:Panel>
</asp:Panel>
<%@ Control Language="C#" ClassName="GlobalNavigator" %>
<%@ Import Namespace="System" %>
<%@ Import Namespace="System.Collections" %>
<%@ Import Namespace="System.Web.UI" %>
<%@ Import Namespace="System.Web.UI.WebControls" %>
<%@ Import Namespace="Microsoft.SharePoint" %>
<%@ Import Namespace="Microsoft.SharePoint.Administration" %>
<script runat="server">
private string webAppName = string.Empty;
private bool visable = true;
private string text = "SP Sites";
private string itemCssClass = string.Empty;
private string menuCssClass = string.Empty;
private string normalCssClass = string.Empty;
private string activeCssClass = string.Empty;
private string mLeaveScript = string.Empty;
private string mEnterScript = string.Empty;
private string mClickScript = string.Empty;
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
try
{
mLeaveScript = "document.getElementById('{0}').className = '{1}'; document.getElementById('{2}').style.display = 'none';";
mEnterScript = "document.getElementById('{0}').className = '{1}';";
mClickScript = "document.getElementById('{0}').style.display = 'block';";
pnlItem.Attributes.Add("onmouseleave", string.Format(mLeaveScript, lblWebApp.ClientID, normalCssClass, pnlMenuHold.ClientID));
lblWebApp.Attributes.Add("onmouseenter", string.Format(mEnterScript, lblWebApp.ClientID, activeCssClass));
lblWebApp.Attributes.Add("onclick", string.Format(mClickScript, pnlMenuHold.ClientID));
pnlItem.Visible = visable;
pnlItem.CssClass = itemCssClass;
lblWebApp.CssClass = normalCssClass;
lblWebApp.Text = text;
pnlMenu.CssClass = menuCssClass;
dlWebSites.DataSource = GetSiteList(webAppName);
dlWebSites.DataBind();
}
catch (Exception ex)
{
lblWebApp.Text = ex.Message;
}
}
}
public string WebAppName
{
get { return webAppName; }
set { webAppName = value; }
}
public bool Visable
{
get { return visable; }
set { visable = value; }
}
public string Text
{
get { return text; }
set { text = value; }
}
public string ItemCssClass
{
get { return itemCssClass; }
set { itemCssClass = value; }
}
public string MenuCssClass
{
get { return menuCssClass; }
set { menuCssClass = value; }
}
public string NormalCssClass
{
get { return normalCssClass; }
set { normalCssClass = value; }
}
public string ActiveCssClass
{
get { return activeCssClass; }
set { activeCssClass = value; }
}
private ArrayList GetSiteList(string appName)
{
ArrayList siteList = new ArrayList();
SPWebServiceCollection webServices = new SPWebServiceCollection(SPFarm.Local);
foreach (SPWebService webService in webServices)
{
foreach (SPWebApplication webApp in webService.WebApplications)
{
if (webApp.IsAdministrationWebApplication || webApp.Name != appName)
continue;
foreach (SPSite site in webApp.Sites)
{
SPWeb web = null;
SPBasePermissions openRight = SPBasePermissions.Open;
SPBasePermissions viewRight = SPBasePermissions.Open;
SPSecurity.RunWithElevatedPrivileges(delegate()
{
using (SPSite tempSite = new SPSite(site.ID))
{
web = tempSite.RootWeb;
openRight = SPBasePermissions.Open;
viewRight = SPBasePermissions.ViewPages;
}
}
);
string loginName = SPContext.Current.Web.CurrentUser.LoginName;
//siteList.Add(new WebSiteInfo(web.Description, site.Url));
if (web.DoesUserHavePermissions(loginName, SPBasePermissions.Open) && web.DoesUserHavePermissions(loginName, SPBasePermissions.ViewPages))
siteList.Add(new WebSiteInfo((web.Description == string.Empty) ? web.Title : web.Description, site.Url));
}
}
}
return siteList;
}
class WebSiteInfo
{
private string siteTitle;
private string siteUrl;
public WebSiteInfo(string siteTitle, string siteUrl)
{
this.siteTitle = siteTitle;
this.siteUrl = siteUrl;
}
public string SiteTitle
{
get { return siteTitle; }
}
public string SiteUrl
{
get { return siteUrl; }
}
}
</script>
<asp:Panel ID="pnlItem" runat="server">
<asp:Label ID="lblWebApp" runat="server" Text="SP Sites"></asp:Label><br />
<asp:Panel ID="pnlMenuHold" runat="server" Style="display: none; position: absolute;
z-index: 20;">
<iframe style="position: absolute; z-index: -1; filter: alpha(opacity=0);"></iframe>
<asp:Panel ID="pnlMenu" runat="server">
<asp:DataList ID="dlWebSites" runat="server" RepeatLayout="Flow">
<ItemTemplate>
<asp:HyperLink ID="HyperLink1" NavigateUrl='<%# DataBinder.Eval(Container, "DataItem.SiteUrl")%>'
runat="server" Width="100%"><%# DataBinder.Eval(Container, "DataItem.SiteTitle")%></asp:HyperLink>
</ItemTemplate>
</asp:DataList>
</asp:Panel>
</asp:Panel>
</asp:Panel>

浙公网安备 33010602011771号