2011-06-07 63 views
9

Asp.Net非常聰明,如果您在開始處放入〜/,則會嘗試解析超鏈接的NavigateUrl相對於它所在的或相對於應用程序根目錄的控件。我可以在超鏈接上顯式指定NavigateUrl嗎?

但我有一個情況,我想明確地設置網址爲相對路徑,我不希望它「幫助」我。

超鏈接的導航網址和HtmlAnchor的href屬性都表現出這種行爲。 是否有可能阻止此行爲 - 或者是否必須手動生成標記而不使用控件?

例如 我有一個包含asp:Hyperlinks的文件夾[appRoot]/foo/bar中的用戶控件。
我正在使用頁面[appRoot]/myPage.aspx中的控件。 我希望超鏈接的href屬性在呈現時完全等於'donkey.gif'

但如果我寫了下面

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

則所呈現的href會'foo/bar/donkey.gif'

由於複雜的原因,我不想進入這裏,使用「〜/ donkey.gif」不是一個選項。 另外,我無法使用ResolveUrl(string url)來生成絕對網址。

+0

我還沒有清楚你的問題,你能告訴我們,你在哪裏試圖指定NavigateURL Explcitly? – 2011-06-07 07:55:49

+0

您如何期待'NavigateUrl =「donkey.gif」'永遠解析爲'images/donkey.gif'?圖像來自哪裏? – 2011-06-07 10:13:08

+0

@Dan Diplo - 我的錯誤。問題已被編輯/更正 – 2011-06-07 13:19:10

回答

4

難道你不能簡單地使用HTML錨點(沒有runat="server"屬性)?例如:

<a href="relative.htm">link text</a> 

更新:如果你不想失去的超級鏈接控件的功能,你可以創建一個控制從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); 
    } 
    } 
} 
+0

看起來這是我不得不去的方式。這是令人沮喪的,因爲我在代碼中設置了一些屬性(如Target,Tooltip等),使得生成整體標記變得繁重。 – 2011-06-07 08:34:36

12

一個更簡單的解決辦法是設置ASP的href屬性:超鏈接,而不是使用NavigateUrl屬性的:

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

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

從.NET4開始,你也可以設置href attribut e直接像這樣:

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

+1。當這麼簡單的事情解決了問題時,我真的很喜歡! – 2012-11-12 18:38:04

+0

謝謝。只需在標記中設置'href'也可以。 – Corgalore 2013-08-28 18:56:58

+0

感謝你們 - 我在我的代碼後面設置了NavigateUrl屬性,它不起作用。設置href屬性起作用。 – RoastBeast 2016-03-18 14:38:52

相關問題