具体实现代码
用户控件方式(GlobalNavigator.ascx):
<%@ 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 ArrayList intranet = new ArrayList();
private ArrayList teamSite = new ArrayList();
private ArrayList mySite = new ArrayList();
private ArrayList partner = new ArrayList();
private ArrayList internet = new ArrayList();
private string intranetName;
private string teamSiteName;
private string mySiteName;
private string partnerName;
private string internetName;
private bool intranetVisable = true;
private bool teamSiteVisable = true;
private bool mySiteVisable = true;
private bool partnerVisable = true;
private bool internetVisable = true;
private string itemCSSClass;
private string menuCSSClass;
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
GetSiteList();
dlIntranet.DataSource = intranet;
dlIntranet.DataBind();
dlTeamSite.DataSource = teamSite;
dlTeamSite.DataBind();
dlMySite.DataSource = mySite;
dlMySite.DataBind();
dlPartner.DataSource = partner;
dlPartner.DataBind();
dlInternet.DataSource = internet;
dlInternet.DataBind();
}
}
public string IntranetName
{
get { return intranetName; }
set { intranetName = value; }
}
public string TeamSiteName
{
get { return teamSiteName; }
set { teamSiteName = value; }
}
public string MySiteName
{
get { return mySiteName; }
set { mySiteName = value; }
}
public string PartnerName
{
get { return partnerName; }
set { partnerName = value; }
}
public string InternetName
{
get { return internetName; }
set { internetName = value; }
}
public bool IntranetVisable
{
get { return intranetVisable; }
set { intranetVisable = value; }
}
public bool TeamSiteVisable
{
get { return teamSiteVisable; }
set { teamSiteVisable = value; }
}
public bool MySiteVisable
{
get { return mySiteVisable; }
set { mySiteVisable = value; }
}
public bool PartnerVisable
{
get { return partnerVisable; }
set { partnerVisable = value; }
}
public bool InternetVisable
{
get { return internetVisable; }
set { internetVisable = value; }
}
public string IntranetText
{
get { return lnkIntranet.Text; }
set { lnkIntranet.Text = value; }
}
public string TeamSiteText
{
get { return lnkTeamSite.Text; }
set { lnkTeamSite.Text = value; }
}
public string MySiteText
{
get { return lnkMySite.Text; }
set { lnkMySite.Text = value; }
}
public string PartnerText
{
get { return lnkPartner.Text; }
set { lnkPartner.Text = value; }
}
public string InternetText
{
get { return lnkInternet.Text; }
set { lnkInternet.Text = value; }
}
public string ItemCSSClass
{
get { return itemCSSClass; }
set { itemCSSClass = value; }
}
public string MenuCSSClass
{
get { return menuCSSClass; }
set { menuCSSClass = value; }
}
private void GetSiteList()
{
ArrayList siteList;
SPWebServiceCollection webServices = new SPWebServiceCollection(SPFarm.Local);
foreach (SPWebService webService in webServices)
{
foreach (SPWebApplication webApp in webService.WebApplications)
{
if (webApp.IsAdministrationWebApplication)
continue;
siteList = new ArrayList();
foreach (SPSite site in webApp.Sites)
{
siteList.Add(new WebSiteInfo(site.RootWeb.Title, site.Url));
}
if (webApp.Name == intranetName)
intranet = siteList;
else if (webApp.Name == teamSiteName)
teamSite = siteList;
else if (webApp.Name == mySiteName)
mySite = siteList;
else if (webApp.Name == partnerName)
partner = siteList;
else if (webApp.Name == internetName)
internet = 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; }
}
}
class NavigatorTemplate : ITemplate
{
public void InstantiateIn(Control container)
{
PlaceHolder pHolder = new PlaceHolder();
HyperLink link = new HyperLink();
link.ID = "link1";
pHolder.Controls.Add(link);
pHolder.DataBinding += new EventHandler(Item_DataBinding);
container.Controls.Add(pHolder);
}
}
static void Item_DataBinding(object sender, System.EventArgs e)
{
PlaceHolder pHolder = (PlaceHolder)sender;
DataListItem item = (DataListItem)pHolder.NamingContainer;
HyperLink link = (HyperLink)pHolder.FindControl("link1");
link.NavigateUrl = (String)DataBinder.Eval(item.DataItem, "SiteUrl");
link.Text = (String)DataBinder.Eval(item.DataItem, "SiteTitle");
}
</script>
<script type="text/javascript">
function showNavigator(naviID)
{
var objList = new Array("intranet","teamSite","mySite","partner","internet");
for (var i=0; i<objList.length; i++)
document.getElementById(objList[i]).style.display = "none";
var obj = document.getElementById(naviID);
obj.style.left = event.clientX - 20;
obj.style.display = "block";
}
function hideNavigator(naviID)
{
setTimeout("{document.getElementById('"+naviID+"').style.display = 'none';}",1000);
}
</script>
<div style="float: left; margin: 0 5px;" class="<%=itemCSSClass %>" οnmοuseleave="hideNavigator('intranet');">
<div>
<asp:HyperLink ID="lnkIntranet" NavigateUrl="javascript:void(0);" runat="server" οnmοuseenter="showNavigator('intranet');"
Text="Intranet"></asp:HyperLink>
</div>
<div id="intranet" style="display: none; position: absolute; z-index: 20;" class="<%=menuCSSClass %>">
<asp:DataList ID="dlIntranet" runat="server" CellSpacing="5">
<ItemTemplate>
<asp:HyperLink ID="HyperLink1" NavigateUrl='<%# DataBinder.Eval(Container, "DataItem.siteUrl")%>'
runat="server"><%# DataBinder.Eval(Container, "DataItem.siteTitle")%></asp:HyperLink>
</ItemTemplate>
</asp:DataList></div>
</div>
<div style="float: left; margin: 0 5px;" class="<%=itemCSSClass %>" οnmοuseleave="hideNavigator('teamSite');">
<div>
<asp:HyperLink ID="lnkTeamSite" NavigateUrl="javascript:void(0);" runat="server" οnmοuseenter="showNavigator('teamSite');"
Text="TeamSite"></asp:HyperLink></div>
<div id="teamSite" style="display: none; position: absolute; z-index: 20;" class="<%=menuCSSClass %>">
<asp:DataList ID="dlTeamSite" runat="server" CellSpacing="5">
<ItemTemplate>
<asp:HyperLink ID="HyperLink1" NavigateUrl='<%# DataBinder.Eval(Container, "DataItem.siteUrl")%>'
runat="server"><%# DataBinder.Eval(Container, "DataItem.siteTitle")%></asp:HyperLink>
</ItemTemplate>
</asp:DataList></div>
</div>
<div style="float: left; margin: 0 5px;" class="<%=itemCSSClass %>" οnmοuseleave="hideNavigator('mySite');">
<div>
<asp:HyperLink ID="lnkMySite" NavigateUrl="javascript:void(0);" runat="server" οnmοuseenter="showNavigator('mySite');"
Text="MySite"></asp:HyperLink></div>
<div id="mySite" style="display: none; position: absolute; z-index: 20;" class="<%=menuCSSClass %>">
<asp:DataList ID="dlMySite" runat="server" CellSpacing="5">
<ItemTemplate>
<asp:HyperLink ID="HyperLink1" NavigateUrl='<%# DataBinder.Eval(Container, "DataItem.siteUrl")%>'
runat="server"><%# DataBinder.Eval(Container, "DataItem.siteTitle")%></asp:HyperLink>
</ItemTemplate>
</asp:DataList></div>
</div>
<div style="float: left; margin: 0 5px;" class="<%=itemCSSClass %>" οnmοuseleave="hideNavigator('partner');">
<div>
<asp:HyperLink ID="lnkPartner" NavigateUrl="javascript:void(0);" runat="server" οnmοuseenter="showNavigator('partner');"
Text="Partner"></asp:HyperLink></div>
<div id="partner" style="display: none; position: absolute; z-index: 20;" class="<%=menuCSSClass %>">
<asp:DataList ID="dlPartner" runat="server" CellSpacing="5">
<ItemTemplate>
<asp:HyperLink ID="HyperLink1" NavigateUrl='<%# DataBinder.Eval(Container, "DataItem.siteUrl")%>'
runat="server"><%# DataBinder.Eval(Container, "DataItem.siteTitle")%></asp:HyperLink>
</ItemTemplate>
</asp:DataList></div>
</div>
<div style="float: left; margin: 0 5px;" class="<%=itemCSSClass %>" οnmοuseleave="hideNavigator('internet');">
<div>
<asp:HyperLink ID="lnkInternet" NavigateUrl="javascript:void(0);" runat="server" οnmοuseenter="showNavigator('internet');"
Text="Internet"></asp:HyperLink></div>
<div id="internet" style="display: none; position: absolute; z-index: 20;" class="<%=menuCSSClass %>">
<asp:DataList ID="dlInternet" runat="server" CellSpacing="5">
<ItemTemplate>
<asp:HyperLink ID="HyperLink1" NavigateUrl='<%# DataBinder.Eval(Container, "DataItem.siteUrl")%>'
runat="server"><%# DataBinder.Eval(Container, "DataItem.siteTitle")%></asp:HyperLink>
</ItemTemplate>
</asp:DataList></div>
</div>
自定义控件方式(GlobalNavigator.cs):
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;
using System.Security.Permissions;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Administration;
namespace EasyPortal
{
[
AspNetHostingPermission(SecurityAction.Demand,
Level = AspNetHostingPermissionLevel.Minimal),
AspNetHostingPermission(SecurityAction.InheritanceDemand,
Level = AspNetHostingPermissionLevel.Minimal),
ToolboxData("<{0}:GlobalNavigator runat=\"server\"> </{0}:GlobalNavigator>"),
]
public class GlobalNavigator : CompositeControl
{
private HyperLink lnkIntranet;
private HyperLink lnkTeamSite;
private HyperLink lnkMySite;
private HyperLink lnkPartner;
private HyperLink lnkInternet;
private DataList dlIntranet;
private DataList dlTeamSite;
private DataList dlMySite;
private DataList dlPartner;
private DataList dlInternet;
private ArrayList intranet = new ArrayList();
private ArrayList teamSite = new ArrayList();
private ArrayList mySite = new ArrayList();
private ArrayList partner = new ArrayList();
private ArrayList internet = new ArrayList();
private string intranetName;
private string teamSiteName;
private string mySiteName;
private string partnerName;
private string internetName;
private bool intranetVisable = true;
private bool teamSiteVisable = true;
private bool mySiteVisable = true;
private bool partnerVisable = true;
private bool internetVisable = true;
private string itemCSSClass;
private string menuCSSClass;
[
Bindable(true),
Category("WebApp"),
Description("The WebApp name for the Intranet sites.")
]
public string IntranetName
{
get
{
return intranetName;
}
set
{
intranetName = value;
}
}
[
Bindable(true),
Category("WebApp"),
Description("The WebApp name for the TeamSite sites.")
]
public string TeamSiteName
{
get
{
return teamSiteName;
}
set
{
teamSiteName = value;
}
}
[
Bindable(true),
Category("WebApp"),
Description("The WebApp name for the MySite sites.")
]
public string MySiteName
{
get
{
return mySiteName;
}
set
{
mySiteName = value;
}
}
[
Bindable(true),
Category("WebApp"),
Description("The WebApp name for the Partner sites.")
]
public string PartnerName
{
get
{
return partnerName;
}
set
{
partnerName = value;
}
}
[
Bindable(true),
Category("WebApp"),
Description("The WebApp name for the Internet sites.")
]
public string InternetName
{
get
{
return internetName;
}
set
{
internetName = value;
}
}
[
Bindable(true),
Category("WebApp"),
Description("The WebApp Visability for the Intranet sites.")
]
public bool IntranetVisable
{
get
{
return intranetVisable;
}
set
{
intranetVisable = value;
}
}
[
Bindable(true),
Category("WebApp"),
Description("The WebApp Visability for the TeamSite sites.")
]
public bool TeamSiteVisable
{
get
{
return teamSiteVisable;
}
set
{
teamSiteVisable = value;
}
}
[
Bindable(true),
Category("WebApp"),
Description("The WebApp Visability for the MySite sites.")
]
public bool MySiteVisable
{
get
{
return mySiteVisable;
}
set
{
mySiteVisable = value;
}
}
[
Bindable(true),
Category("WebApp"),
Description("The WebApp Visability for the Partner sites.")
]
public bool PartnerVisable
{
get
{
return partnerVisable;
}
set
{
partnerVisable = value;
}
}
[
Bindable(true),
Category("WebApp"),
Description("The WebApp Visability for the Internet sites.")
]
public bool InternetVisable
{
get
{
return internetVisable;
}
set
{
internetVisable = value;
}
}
[
Bindable(true),
Category("SiteText"),
DefaultValue("Intranet"),
Description("The text for the Intranet sites.")
]
public string IntranetText
{
get
{
EnsureChildControls();
return lnkIntranet.Text;
}
set
{
EnsureChildControls();
lnkIntranet.Text = value;
}
}
[
Bindable(true),
Category("SiteText"),
DefaultValue("TeamSite"),
Description("The text for the TeamSite sites.")
]
public string TeamSiteText
{
get
{
EnsureChildControls();
return lnkTeamSite.Text;
}
set
{
EnsureChildControls();
lnkTeamSite.Text = value;
}
}
[
Bindable(true),
Category("SiteText"),
DefaultValue("MySite"),
Description("The text for the MySite sites.")
]
public string MySiteText
{
get
{
EnsureChildControls();
return lnkMySite.Text;
}
set
{
EnsureChildControls();
lnkMySite.Text = value;
}
}
[
Bindable(true),
Category("SiteText"),
DefaultValue("Partner"),
Description("The text for the Partner sites.")
]
public string PartnerText
{
get
{
EnsureChildControls();
return lnkPartner.Text;
}
set
{
EnsureChildControls();
lnkPartner.Text = value;
}
}
[
Bindable(true),
Category("SiteText"),
DefaultValue("Internet"),
Description("The text for the Internet sites.")
]
public string InternetText
{
get
{
EnsureChildControls();
return lnkInternet.Text;
}
set
{
EnsureChildControls();
lnkInternet.Text = value;
}
}
[
Bindable(true),
Category("Appearance"),
Description("The CSS class name for the navigator item.")
]
public string ItemCSSClass
{
get
{
return itemCSSClass;
}
set
{
itemCSSClass = value;
}
}
[
Bindable(true),
Category("Appearance"),
Description("The CSS class name for the navigator menu.")
]
public string MenuCSSClass
{
get
{
return menuCSSClass;
}
set
{
menuCSSClass = value;
}
}
protected override void RecreateChildControls()
{
EnsureChildControls();
}
protected override void CreateChildControls()
{
Controls.Clear();
GetSiteList();
lnkIntranet = new HyperLink();
lnkTeamSite = new HyperLink();
lnkMySite = new HyperLink();
lnkPartner = new HyperLink();
lnkInternet = new HyperLink();
dlIntranet = new DataList();
dlTeamSite = new DataList();
dlMySite = new DataList();
dlPartner = new DataList();
dlInternet = new DataList();
HyperLink[] linkList = new HyperLink[] { lnkIntranet, lnkTeamSite, lnkMySite, lnkPartner, lnkInternet };
DataList[] dataLists = new DataList[] { dlIntranet, dlTeamSite, dlMySite, dlPartner, dlInternet };
ArrayList[] siteList = new ArrayList[] { intranet, teamSite, mySite, partner, internet };
string[] titleList = new string[] { "Intranet", "TeamSite", "MySite", "Partner", "Internet" };
string[] divIDList = new string[] { "intranet", "teamSite", "mySite", "partner", "internet" };
for (int i = 0; i < 5; i++)
{
linkList[i].Text = titleList[i];
linkList[i].NavigateUrl = "#";
linkList[i].Attributes.Add("onmouseenter", "showNavigator('" + divIDList[i] + "');");
dataLists[i].CellSpacing = 5;
dataLists[i].ItemTemplate = new NavigatorTemplate();
dataLists[i].DataSource = siteList[i];
dataLists[i].DataBind();
this.Controls.Add(linkList[i]);
this.Controls.Add(dataLists[i]);
}
}
protected override void Render(HtmlTextWriter writer)
{
HyperLink[] linkList = new HyperLink[] { lnkIntranet, lnkTeamSite, lnkMySite, lnkPartner, lnkInternet };
DataList[] dataLists = new DataList[] { dlIntranet, dlTeamSite, dlMySite, dlPartner, dlInternet };
bool[] appVisable = new bool[] { intranetVisable, teamSiteVisable, mySiteVisable, partnerVisable, internetVisable };
string[] divIDList = new string[] { "intranet", "teamSite", "mySite", "partner", "internet" };
AddAttributesToRender(writer);
RegisterScript();
for (int i = 0; i < 5; i++)
{
if (appVisable[i])
writer.AddAttribute("style", "float: left; margin: 0 5px;");
else
writer.AddAttribute("style", "float: left; margin: 0 5px; display: none;");
writer.AddAttribute("class", itemCSSClass);
writer.AddAttribute("onmouseleave", "hideNavigator('" + divIDList[i] + "');");
writer.RenderBeginTag(HtmlTextWriterTag.Div);
writer.RenderBeginTag(HtmlTextWriterTag.Div);
linkList[i].RenderControl(writer);
writer.RenderEndTag();
writer.AddAttribute("id", divIDList[i]);
writer.AddAttribute("style", "display: none; position: absolute; z-index: 20;");
writer.AddAttribute("class", menuCSSClass);
writer.RenderBeginTag(HtmlTextWriterTag.Div);
dataLists[i].RenderControl(writer);
writer.RenderEndTag();
writer.RenderEndTag();
}
}
private void RegisterScript()
{
string scriptStr = "<script type='text/javascript'>" +
"function showNavigator(naviID) {" +
"var objList = new Array('intranet','teamSite','mySite','partner','internet');" +
"for (var i=0; i<objList.length; i++)" +
"document.getElementById(objList[i]).style.display = 'none';" +
"var obj = document.getElementById(naviID);" +
"obj.style.left = event.clientX - 20;" +
" obj.style.display = 'block'; }" +
"function hideNavigator(naviID) {" +
"setTimeout(\"{ document.getElementById('\"+naviID+\"').style.display = 'none';}\",1000); }" +
"</script>";
this.Page.ClientScript.RegisterStartupScript(this.GetType(), "showNavigator", scriptStr);
}
private void GetSiteList()
{
ArrayList siteList;
SPWebServiceCollection webServices = new SPWebServiceCollection(SPFarm.Local);
foreach (SPWebService webService in webServices)
{
foreach (SPWebApplication webApp in webService.WebApplications)
{
if (webApp.IsAdministrationWebApplication)
continue;
siteList = new ArrayList();
foreach (SPSite site in webApp.Sites)
{
siteList.Add(new WebSiteInfo(site.RootWeb.Title, site.Url));
}
if (webApp.Name == intranetName)
intranet = siteList;
else if (webApp.Name == teamSiteName)
teamSite = siteList;
else if (webApp.Name == mySiteName)
mySite = siteList;
else if (webApp.Name == partnerName)
partner = siteList;
else if (webApp.Name == internetName)
internet = siteList;
}
}
}
static void Item_DataBinding(object sender, System.EventArgs e)
{
PlaceHolder pHolder = (PlaceHolder)sender;
DataListItem item = (DataListItem)pHolder.NamingContainer;
HyperLink link = (HyperLink)pHolder.FindControl("link1");
link.NavigateUrl = (String)DataBinder.Eval(item.DataItem, "SiteUrl");
link.Text = (String)DataBinder.Eval(item.DataItem, "SiteTitle");
}
class NavigatorTemplate : ITemplate
{
public void InstantiateIn(Control container)
{
PlaceHolder pHolder = new PlaceHolder();
HyperLink link = new HyperLink();
link.ID = "link1";
pHolder.Controls.Add(link);
pHolder.DataBinding += new EventHandler(Item_DataBinding);
container.Controls.Add(pHolder);
}
}
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; }
}
}
}
}
使用说明:
一、資源介紹
GlobalNavigator.ascx:以用戶控件的方式實現的GlobalNavigator源文件。
EasyPortal.dll:以自定義控件的方式實現的GlobalNavigator打包文件。
UserGuide.doc:控件使用説明文檔。
二、功能説明
該控件提供基於MOSS2007平臺的全局導航功能。控件定義了五种類型的WebApplication,分別為:Intranet、TeamSite、MySite、Partner、Internet。用戶在MOSS2007中創建了WebApplication及 SiteCollection后,在控件中指定各种類型的WebApplication名稱。控件根據用戶配置的WebApplication名稱,從MOSS2007中抓取到所有符合當前用戶權限規則的SiteCollection,並以連接的形式呈現在頁面,點擊連接可以導航到各個不同類型的WebApplication下的SiteCollection。
不同類型的WebApplication以連接形式水平排列(排列順序不可配置),通過配置可以隱藏任何一個WebApplication。各WebApplication下的SiteCollection以浮動菜單的形式呈現,默認情況下不可見,當鼠標移動到某一WebApplication処,該WebApplication下的SiteCollection浮動菜單自動彈出。點擊某一SiteCollection,頁面將導向對應的網頁。當鼠標移出WebApplication和SiteCollection所在區域,浮動菜單在一秒鐘后自動隱藏。
三、運行環境
該控件專門針對MOSS2007設計(其它MOSS版本未經測試,兼容性未知),控件必須運行于MOSS2007的Web頁面上。
控件已經在IE6.0上測試通過,對於其它版本的IE或其它類型的瀏覽器,不能保證其兼容性(主要是考慮到不同瀏覽器對Javascript的支持不同)。
四、公用屬性説明
名稱 | 功能説明 |
IntranetName | Intranet所對應的WebApplication名稱 |
TeamSiteName | TeamSite所對應的WebApplication名稱 |
MySiteName | MySite所對應的WebApplication名稱 |
PartnerName | Partner所對應的WebApplication名稱 |
InternetName | Internet所對應的WebApplication名稱 |
IntranetVisable | 是否顯示Intranet |
TeamSiteVisable | 是否顯示TeamSite |
MySiteVisable | 是否顯示MySite |
PartnerVisable | 是否顯示Partner |
InternetVisable | 是否顯示Internet |
IntranetText | Intranet在頁面上顯示的名稱,默認為“Intranet” |
TeamSiteText | TeamSite在頁面上顯示的名稱,默認為“TeamSite” |
MySiteText | MySite在頁面上顯示的名稱,默認為“MySite” |
PartnerText | Partner在頁面上顯示的名稱,默認為“Partner” |
InternetText | Internet在頁面上顯示的名稱,默認為“Internet” |
ItemCSSClass | Item的CSS Class名稱。注:Item包括WebApplication及SiteCollection。 |
MenuCSSClass | SiteCollection menu的CSS Class名稱。注:Menu僅表示某一WebApplication下的SiteCollection。 |
五、部署運用
部署用戶控件GlobalNavigator.ascx:
1. 將控件文件拷貝到MOSS2007存放用戶控件的目錄下,如:C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\CONTROLTEMPLATES
2. 編輯MasterPage文件,在文件頭部注冊該控件:
<%@ Register TagPrefix="EasyPortal" TagName="GNavigator" src="~/_controltemplates/GlobalNavigator.ascx" %>
3. 在頁面需要應用該控件的地方添加控件:
<EasyPortal:GNavigator id="navi1" runat="server" InternetName=" InternetName" IntranetName=" IntranetName" MySiteName=" MySiteName" PartnerName=" PartnerName" TeamSiteName=" TeamSiteName" />
4. 配置相關屬性,定義CSS Class以控制控件外觀。
5. 測試效果。
部署自定義控件EasyPortal.dll: