Asp.net

我可以在超連結上明確指定 NavigateUrl 嗎?

  • November 20, 2012

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)用來生成絕對網址。

您不能簡單地使用 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);
   }
 }
}

一個更簡單的解決方案是設置 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" />

引用自:https://stackoverflow.com/questions/6262161