2011-02-09 51 views
2

我有一個超鏈接,在某些情況下,我想要更改爲顯示一個jquery彈出窗口,但我在主頁上執行時遇到一個奇怪的問題頁。在常規頁面下面的工作:hyperlink.NavigateUrl在母版頁上更改(可能通過ResolveUrl())

hyp1.NavigateUrl = "#notificationPopup"; 

其中作爲渲染:

<a id="ctl00_hyp1" href="#notificationPopup">Example</a> 

這正是我想要的。問題是與超鏈接完全相同的代碼它呈現母版頁上爲:

<a id="ctl00_hyp1" href="../MasterPages/#notificationPopup">Example</a> 

它看起來像它可能是貫穿ResolveClientUrl()的navigateUrl什麼,當我把它放在主頁。我試過換了<asp:hyperlink換成<a href runat=server,但是同樣的事情發生了。

任何想法?

回答

1

有一個注意MSDN Control.ResolveClientUrl方法說明。

通過此方法返回的URL是 相對於包含 源文件,其中控制是 實例化的文件夾。繼承 此屬性的控件(如UserControl和 MasterPage)將返回完全相對於該控件的 合格URL。

因此,您的檢查中的母版頁的行爲是完全可預測的(儘管這不是一件很舒服的工作)。那麼有什麼選擇?

最好的是將<a>設置爲客戶端控件(刪除runat="server");應該像一個魅力即使在母版頁:

<a href="#notificationPopup">Example</a> 

在這種情況下,如果這種控制應該只有服務器端:你可以只建立在您的代碼的URL後面用UriBuilder類:

UriBuilder newPath = new UriBuilder(Request.Url); 
// this will add a #notificationPopup fragment to the current URL 
newPath.Fragment = "notificationPopup"; 
hyp1.HRef = newPath.Uri.ToString(); 
+0

歡迎關於重建完整URL的想法。使用實際的URL +「#notificationPopup」在彈出窗口中工作得很好,所以我使用了:`請求。Url.ToString()+「#notificationPopup」;`因爲它更簡單 – 2011-03-22 10:00:40

0

在窗體上創建一個隱藏字段,並將值設置爲您要導航的位置/超鏈接的URL而不是超鏈接導航url。然後調用JavaScript中超鏈接的onclick方法,並在瀏覽器進行實際導航之前設置超鏈接。

<html><head><title></title></head> 
<script type="text/javascript"> 

function navHyperlink(field) 
{ 
field.href = document.getElementById('ctl00_hdnHypNav').value; 
return true; 
} 

</script> 
<input type="hidden" id="hdnHypNav" value="test2.html" runat="server"/> 
    <a href="" onclick="navHyperlink(this);" >click here</a> 
</html> 

代碼後面將是: hdnHypNav.value = 「#notificationPopup」;

你也可以只嘗試用下面的代碼的回傳後設置的URL,如更換你的代碼背後有這一行,但我不知道是否會工作...

ScriptManager.RegisterStartupScript(this,this.GetType(),"SetHyp","$('ctl00_hyp1').href = '#notificationPopup';",True) 
0

我找到了解決問題的另一種方法。

hyp1.Attributes.Add("href", "#notificationPopup");