asp.net中sitemap中的菜單節點在點擊後,默認是在本頁面打開連接, 就是說a的target是_self, 現在想要有一些節點實現target=_blank的效果, 想了一下, sitemap既然是xml的,應該可自定義屬性的, 所以自定義了一個target屬性--<siteMapNode url="~/a.aspx" target="_blank" title="aaa" description="" />, 在repeater綁定裏<a href='<%# Eval("url")%>' target='<%# Eval("target")%>'>, 發現是不可行的, 微軟內置讀sitemap的類裏是不可讀取sitemap自定議屬性的,
突然發現有description屬性沒有用上,就用這個吧<siteMapNode url="~/a.aspx" title="aaa" description="_blank" /> 綁定: <a href='<%# Eval("url")%>' target='<%# Eval("description")%>'>,發現這種方式真的可行.
到網上看一下別人怎麼做的, 搜了一下,發現一篇文章, http://www.wangchao.net.cn/bbsdetail_545376.html 裏頭是這樣實現的
首先在sitemap文件添加自己定義屬性,這裏我們用 target <siteMapNode title="首頁" description="" target="_blank" url="~/Default.aspx" /> 然後爲 Menu 控件添加 MenuItemDataBound 事件處理代碼
protected void MyMenu_MenuItemDataBound(object sender, MenuEventArgs e)
{
string target = ((SiteMapNode)e.Item.DataItem)["target"];
if (target != null && target.Length > 0) e.Item.Target = target;
}
有樣學樣,我也這樣做,雖然我用的是repeater,
sitemapnode這樣寫<siteMapNode url="/a.aspx" target="_blank" title="test" description="" />
綁定代碼是<a href='<%# Eval("url")%>'>
後臺在repeater的事件中這樣寫
protected void repeater2_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
//set CEO link as a new open form
string target = ((SiteMapNode)e.Item.DataItem)["target"];
if (target != null && target.Length > 0)
{
string tempString = "";
if (e.Item.HasControls())
{
//get original control
System.Web.UI.DataBoundLiteralControl originControl;
originControl = e.Item.Controls[0] as System.Web.UI.DataBoundLiteralControl;
//define a new control
System.Web.UI.DataBoundLiteralControl tempControl = new DataBoundLiteralControl(1, 1);;
//use old control's source string, and add target
tempString = originControl.Text.Replace("<a href=", "<a target='_blank' href=");
tempControl.SetDataBoundString(0, tempString);
//tempControl.SetStaticString(0, tempString);
e.Item.Controls.Add(tempControl);
e.Item.Controls.Remove(originControl);
}
}
}