前段時間在做了一個項目,在設計時使用了SiteMap作為整個項目的導航,在做介面設計時利用第三方控制項ComponentArt來實現,這東西用起來很方便,但就是不免費,由於沒錢只能找破解的,但在使用過程中,經常出問題,被上頭批評了好幾回,也怪自己懶,不想用JS來寫,後來想起了AjaxControlToolkit有個Accordion可以收縮的,和ComponentArt的導航效果一個樣,實現也不難,現在和大家分享一下自己的這段代碼:
這是aspx代碼
<ajaxToolkit:Accordion ID="acd1" runat="server" OnItemDataBound="acd1_ItemDataBound"
CssClass="navBar" HeaderCssClass="navHeader" AutoSize="Fill" Height="400" SelectedIndex="-1">
<HeaderTemplate>
<%#Eval("Title") %>
</HeaderTemplate>
<ContentTemplate>
<asp:Repeater ID="rpt" runat="server" OnItemDataBound="rpt_ItemDataBound">
<ItemTemplate>
<div class="divlnk">
<asp:HyperLink ID="hlnk" CssClass="hlnk" runat="server" Text='<%#Eval("Title")%>' NavigateUrl='<%#Eval("url") %>' />
</div>
</ItemTemplate>
</asp:Repeater>
</ContentTemplate>
</ajaxToolkit:Accordion>
這是cs代碼:protected void Page_Load(object sender, EventArgs e)
{
SiteMapNode node = SiteMap.RootNode;
this.acd1.DataSource = node.ChildNodes;
acd1.DataBind();
int i = 0;
foreach (SiteMapNode no in node.ChildNodes)
{
if (SiteMap.CurrentNode != null && SiteMap.CurrentNode.ParentNode != null && SiteMap.CurrentNode.ParentNode == no)
{
acd1.SelectedIndex = i;
break;
}
i++;
}
}
protected void acd1_ItemDataBound(object sender, AjaxControlToolkit.AccordionItemEventArgs e)
{
Repeater rpt = e.AccordionItem.FindControl("rpt") as Repeater;
if (rpt != null)
{
SiteMapNode node = e.Item as SiteMapNode;
if (node != null && node.ChildNodes.Count > 0)
{
rpt.DataSource = node.ChildNodes;
rpt.DataBind();
}
}
}
protected void rpt_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
Image img = e.Item.FindControl("img") as Image;
SiteMapNode node = e.Item.DataItem as SiteMapNode;
if (node != null)
{
string imgUrl = node["img"]; //這在SiteMap自己加的屬性
if (node != null && imgUrl != null)
{
img.ImageUrl = imgUrl;
}
}
}
如果學過資料繫結控制項應可以看懂的。
說明:這段代碼只是實現二級導航,好多管理系統的後台都有類似的導航。