【问题标题】:Can I explicitly specify the NavigateUrl on a hyperlink?我可以在超链接上明确指定 NavigateUrl 吗?
【发布时间】:2011-09-09 20:50:29
【问题描述】:

Asp.Net 非常聪明,如果您将 ~/ 放在开头,它会尝试解析相对于它所在的控件或相对于应用程序根的超链接的 NavigateUrl

但我有一种情况,我想明确地将 url 设置为相对路径,我根本不希望它“帮助”我。

超链接的导航 url 和 HtmlAnchor 的 href 属性都表现出这种行为。 是否可以停止这种行为 - 还是我必须手动生成标记而不使用控件?

例如 我在文件夹 [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) 来生成绝对网址。

【问题讨论】:

  • 我没有清楚地知道你的问题,你能告诉我们,你试图在哪里明确指定 NavigateURL 吗?
  • 您如何期望NavigateUrl="donkey.gif" 永远解析为images/donkey.gif?图片来自哪里?
  • @Dan Diplo - 我的错误。问题已被编辑/更正
  • 对引号的使用哈哈大笑:“帮助”我,它很有帮助! :D

标签: asp.net .net hyperlink


【解决方案1】:

更简单的解决方案是设置 asp:hyperlink 的 href 属性,而不是使用 NavigateUrl 属性:

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

hyperlink1.Attributes("href") = ResolveUrl("~/dir/page.aspx")

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

<asp:Hyperlink runat="server" href="donkey.gif" />

【讨论】:

  • +1。我真的很喜欢这么简单的事情就能解决问题!
  • 谢谢 - 我在我的代码隐藏中设置了 NavigateUrl 属性,但它不起作用。设置 href 属性有效。
  • .Net 4 上的一些事情“google.com”或其他任何内容,b) 我收到myHyperLink.Attributes("href") 的编译器错误。编译器错误通过使用myHyperLink.Attributes["href"] 解决。我不会编辑这篇文章,因为似乎有些人已经用这种方法取得了成功。 This link 帮助了我。
  • 它确实适用于 .Net 4 - 只要确保您没有在 html 中同时使用 href 和 NavigateUrl 属性。使用其中一种。
【解决方案2】:

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

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

自定义超链接控件:

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

【讨论】:

  • 看来这是我必须走的路。这很令人沮丧,因为我在代码中设置了一些属性(例如 Target、Tooltip 等),这使得生成整体标记变得繁琐。
猜你喜欢
  • 2014-05-31
  • 1970-01-01
  • 2015-07-30
  • 1970-01-01
  • 1970-01-01
  • 2020-05-18
  • 2016-09-20
  • 1970-01-01
  • 2012-03-07
相关资源
最近更新 更多