前些天已经实现件,但当时是把所有可能的WebApplicationHardcode在代里了。到后续扩展和变更的需要,同时也简化开发和调用,我稍微做了些改动,在控件中只封装一个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>
posted on 2008-01-03 14:50  Jacky Huang  阅读(229)  评论(0)    收藏  举报