Маршрутизация к якорю на другой странице

Я использую маршрутизацию веб-форм в 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-кодирования? Или любой другой способ маршрутизации к якорю?

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


person Slauma    schedule 20.06.2010    source источник


Ответы (4)


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

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

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

person Eilon    schedule 20.06.2010
comment
Хм, я надеялся на декларативное решение. Что ж, указание NavigateUrl в коде программной части будет последним средством. - person Slauma; 20.06.2010
comment
Я придумал то же самое самостоятельно, но нашел этот ответ, когда искал, есть ли лучшее решение. Для меня это было легко сделать, так как я уже делал ссылки в коде для поддержки моего собственного взгляда на локализацию маршрута. В любом случае, причина, по которой я отвечаю здесь, заключалась в том, чтобы предоставить пример кода для этого ответа: Dim vpd As VirtualPathData = RouteTable.Routes.GetVirtualPath(Nothing, NamedRoute, Nothing) hyperLink.NavigateUrl = vpd.VirtualPath & #anchorName - person Daniel Flöijer; 24.04.2013

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

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, вы можете избежать декодирования этого значения, и, кроме того, это кажется более чистым способом сделать это.

person Jacob    schedule 20.06.2010
comment
Это именно то, что я пробовал раньше. Но у него есть две проблемы: 1) Если вы просто введете URL-адрес маршрута без привязки в браузере (http://server/Path/SubPath), вы получите 404, поскольку этот маршрут больше не является допустимым. 2) Нежелательная кодировка URL-адреса # все еще происходит. - person Slauma; 20.06.2010

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

person Martea    schedule 11.09.2012
comment
Вопрос был о веб-формах ASP.NET, а не о MVC. Так что контроллера нет. - person Slauma; 11.09.2012

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

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

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

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

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