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));
Другие вопросы по тегам