代码之家  ›  专栏  ›  技术社区  ›  Slauma

路由到另一页上的锚定

  •  2
  • Slauma  · 技术社区  · 14 年前

    我正在使用ASP.NET 4中的Web表单路由,我正在尝试路由到页面上的特定位置。在那个页面上我有一个元素 <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 回复  |  直到 9 年前
        1
  •  4
  •   Eilon    14 年前

    ASP.NET的路由功能不支持定位。路由被设计为只支持应用程序路径之后和锚之前的URL部分。

    我建议添加一个事件处理程序(例如page_load),在该事件处理程序中,生成URL、附加锚并设置超链接控件的值。

    当然,在大多数情况下,对于Web表单路由,最简单的方法是手动将URL设置为您想要的任何内容。当URL不复杂且不太可能更改时,这是一个不错的选择。

        2
  •  0
  •   Jacob    14 年前

    这行吗?

    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 placeholder,您可以避免对该值进行解码,而且这似乎是一种更清洁的方法。

        3
  •  0
  •   Martea    12 年前

    路由到控制器,然后用anchor参数重新路由到页面,怎么样?

        4
  •  0
  •   Brian    9 年前

    我知道这是一个老问题,但也许其他人可以从这种方法中获益。

    创建不带定位点的路线。

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

    然后像这样构造URL,附加锚。

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