Asp.Net非常聪明,如果你在开头放置〜/,试图解析相对于它所在的控件或相对于应用程序根的控件的NavigateUrl
。
但我有一种情况,我想明确地将网址设置为相对路径,我不希望它“帮助”我。
Hyperlink的导航URL和HtmlAnchor的href属性都表现出这种行为。 是否可以阻止此行为 - 或者我是否必须手动生成标记而不使用控件?
e.g。
我在文件夹[appRoot]/foo/bar
中有一个包含asp:Hyperlinks
的用户控件
我正在使用页面[appRoot]/myPage.aspx
中的控件。
我希望超链接的href
属性在渲染时完全等于'donkey.gif'
。
但如果我写下面的话
<asp:Hyperlink runat="server" NavigateUrl="donkey.gif" />
然后渲染的href将是'foo/bar/donkey.gif'
。
由于复杂的原因我不想进入这里,使用“〜/ donkey.gif”不是一种选择。
另外,我无法使用ResolveUrl(string url)
生成绝对网址。
答案 0 :(得分:12)
更简单的解决方案是设置asp:超链接的href属性,而不是使用NavigateUrl属性:
hyperlink1.Attributes("href") = "exactpath.gif"
hyperlink1.Attributes("href") = ResolveUrl("~/dir/page.aspx")
从.NET4开始,你也可以像这样直接设置href属性:
<asp:Hyperlink runat="server" href="donkey.gif" />
答案 1 :(得分:4)
您不能简单地使用HTML锚点(没有runat="server"
属性)吗? E.g:
<a href="relative.htm">link text</a>
更新:如果您不想丢失HyperLink控件的功能,可以创建一个源自HyperLink
的控件并覆盖AddAttributesToRender()
方法(这是解决NavigateUrl的地方。)
HyperLink.AddAttributesToRender()
看起来像这样:
protected override void AddAttributesToRender(HtmlTextWriter writer)
{
...
string navigateUrl = this.NavigateUrl;
if (navigateUrl.Length > 0 && base.IsEnabled)
{
string str = base.ResolveClientUrl(navigateUrl);
writer.AddAttribute(HtmlTextWriterAttribute.Href, str);
}
...
}
自定义HyperLink控件:
public class MyHyperLink : HyperLink
{
protected override void AddAttributesToRender(HtmlTextWriter writer)
{
if ((base.Enabled && !base.IsEnabled) && base.SupportsDisabledAttribute)
{
writer.AddAttribute(HtmlTextWriterAttribute.Disabled, "disabled");
}
base.AddAttributesToRender(writer);
if (this.NavigateUrl.Length > 0 && base.IsEnabled)
{
writer.AddAttribute(HtmlTextWriterAttribute.Href, this.NavigateUrl);
}
if (this.Target.Length > 0)
{
writer.AddAttribute(HtmlTextWriterAttribute.Target, this.Target);
}
}
}