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);
}
}
}