Направление на якорь на другой странице

Я использую маршрутизацию веб-форм в ASP.NET 4, и я пытаюсь перенаправить в определенное место на странице. На этой странице у меня есть такой элемент, как <div id="3"> и я хотел бы перейти на этот якорь с другой страницы. Для этого я определил маршрут в global.asax:

RouteTable.Routes.MapPageRoute("MyRoute", "Path/SubPath/{PageAnchor}",
    "~/MyPage.aspx", true, new RouteValueDictionary { { "PageAnchor", null } });

Гиперссылка для ссылки на эту страницу и якорь "3" определены в разметке следующим образом:

<asp:HyperLink ID="HyperLink1" runat="server"
    NavigateUrl="<%$ RouteUrl:RouteName=MyRoute,PageAnchor=#3 %>">
    Link</asp:HyperLink>

Проблема с сгенерированной ссылкой в ​​том, что # символ в URL кодируется %23 сюда: http://localhost:1234/Path/SubPath/%233 так что я достигаю целевой страницы, но не на указанной привязке.

Есть ли способ избежать этой нежелательной кодировки URL? Или какой-то другой способ направить на якорь?

Заранее спасибо!

4 ответа

Решение

Якоря не поддерживаются функцией маршрутизации ASP.NET. Маршрутизация предназначена для поддержки только части URL-адреса после пути приложения и до привязки.

Я предлагаю добавить обработчик событий (например, Page_Load) и в этом обработчике событий сгенерировать URL-адрес, добавить привязку и установить значение в элементе управления HyperLink.

Конечно, в большинстве случаев с маршрутизацией веб-форм проще всего установить URL-адрес вручную по своему усмотрению. Это хороший вариант, когда URL не сложный и вряд ли изменится.

Я знаю, что это старый вопрос, но, возможно, кто-то еще мог бы извлечь выгоду из этого подхода.

Создать маршрут без якоря.

RouteTable.Routes.MapPageRoute("MyRoute", "Path/SubPath", "~/MyPage.aspx");

А затем создайте URL-адрес, добавив якорь.

<a href="<%: GetRouteUrl("MyRoute", null) + "#3" %>">Link</a>

Как насчет маршрута, идущего к контроллеру, который перенаправляет на страницу с параметром привязки?

Это работает?

RouteTable.Routes.MapPageRoute("MyRoute", "Path/SubPath/#{PageAnchor}",
    "~/MyPage.aspx", true, new RouteValueDictionary { { "PageAnchor", null } })

<asp:HyperLink ID="HyperLink1" runat="server"
    NavigateUrl="<%$ RouteUrl:RouteName=MyRoute,PageAnchor=3 %>">
    Link</asp:HyperLink>

Если вы разместите # за пределами PageAnchor заполнитель, вы можете избежать декодирования этого значения, и, кроме того, это кажется более чистым способом сделать это.

Другие вопросы по тегам