hyperlink.NavigateUrl изменяется на главной странице (возможно, с помощью ResolveUrl())
У меня есть гиперссылка, которую в некоторых случаях я хочу изменить, чтобы показать всплывающее окно jquery, но у меня возникает странная проблема при выполнении этого на главной странице. Следующие работы на обычной странице:
hyp1.NavigateUrl = "#notificationPopup";
Который отображается как:
<a id="ctl00_hyp1" href="#notificationPopup">Example</a>
Это именно то, что я хочу. Проблема заключается в том же коде гиперссылки на главной странице, которую он отображает как:
<a id="ctl00_hyp1" href="../MasterPages/#notificationPopup">Example</a>
Похоже, что это может быть запускать navigateUrl через ResolveClientUrl() или что-то, когда я устанавливаю его на главной странице. Я пытался обменять <asp:hyperlink
для <a href runat=server
, но происходит то же самое.
Есть идеи?
4 ответа
На 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();
Я нашел другой способ решить проблему.
hyp1.Attributes.Add("href", "#notificationPopup");
Создайте скрытое поле в своей форме и установите значение, по которому вы хотите перемещаться / URL-адрес гиперссылки вместо гиперссылок. Затем вызовите метод onclick для гиперссылки в javascript и установите там гиперссылку, прежде чем браузер выполнит фактическую навигацию.
<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)
Видя всю причину, по которой я заменил свою статическую гиперссылку на
Мое исправление состояло в том, чтобы заключить гиперссылку в литерал:
<asp:Literal ID="lit1" runat="server" meta:resourcekey="lit1">
<a href="#notificationPopup">Example</a>
</asp:Literal>
Недостатком является то, что если вам нужно программно манипулировать ссылкой, это немного раздражает:
lit1.Text = String.Format("<a href=\"{0}\">Example</a>", HttpUtility.HtmlAttributeEncode(url));