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

Chr*_*ell 9 .net asp.net hyperlink

Asp.Net非常聪明,并且NavigateUrl如果你在开头放置〜/,试图解决相对于它所在的控件或相对于应用程序根的控件的超链接.

但我有一种情况,我想明确地将网址设置为相对路径,我不希望它"帮助"我.

Hyperlink的导航URL和HtmlAnchor的href属性都表现出这种行为.是否可以阻止此行为 - 或者我是否必须手动生成标记而不使用控件?

例如, 我在[appRoot]/foo/bar包含的文件夹中有一个用户控件asp:Hyperlinks.
我正在使用页面中的控件[appRoot]/myPage.aspx.我希望href超链接的属性在渲染时完全等于'donkey.gif'.

但是,如果我写下面的内容

 <asp:Hyperlink runat="server" NavigateUrl="donkey.gif" />
Run Code Online (Sandbox Code Playgroud)

然后渲染的href将是'foo/bar/donkey.gif'.

由于复杂的原因我不想进入这里,使用"〜/ donkey.gif"不是一个选项.此外,我不能用于ResolveUrl(string url)生成绝对网址.

Geo*_*kos 12

一个更简单的解决方案是设置asp:超链接的href属性,而不是使用NavigateUrl属性:

hyperlink1.Attributes("href") = "exactpath.gif"

hyperlink1.Attributes("href") = ResolveUrl("~/dir/page.aspx")
Run Code Online (Sandbox Code Playgroud)

从.NET4开始,你也可以像这样直接设置href属性:

<asp:Hyperlink runat="server" href="donkey.gif" />
Run Code Online (Sandbox Code Playgroud)

  • +1.我真的很喜欢这么简单的事情解决问题! (2认同)

M4N*_*M4N 4

不能简单地使用 HTML 锚点(没有runat="server"属性)吗?例如:

<a href="relative.htm">link text</a>
Run Code Online (Sandbox Code Playgroud)

更新:如果您不想失去 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);
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

自定义超链接控件:

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);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)