我可以在超链接上明确指定NavigateUrl吗?

时间:2011-06-07 07:52:22

标签: asp.net .net hyperlink

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)生成绝对网址。

2 个答案:

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