【问题标题】:Routing to an anchor on another page路由到另一个页面上的锚点
【发布时间】:2011-03-06 01:12:48
【问题描述】:

我在 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 编码?或任何其他方式路由到锚点?

提前谢谢你!

【问题讨论】:

    标签: asp.net routing anchor asp.net-4.0 webforms-routing


    【解决方案1】:

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

    创建没有锚点的路线。

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

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

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

    【讨论】:

      【解决方案2】:

      路由到控制器并重新路由到带有锚参数的页面怎么样?

      【讨论】:

      • 问题是关于 ASP.NET Webforms,而不是 MVC。所以,没有控制器。
      【解决方案3】:

      ASP.NET 的路由功能不支持锚点。路由旨在仅支持应用程序路径之后和锚点之前的 URL 部分。

      我建议添加一个事件处理程序(例如 Page_Load)并在该事件处理程序中生成 URL、附加锚点并在 HyperLink 控件上设置值。

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

      【讨论】:

      • 嗯,我希望有一个声明性的解决方案。好吧,在代码隐藏中指定 NavigateUrl 将是最后的手段。
      • 我自己想出了同样的事情,但是在寻找是否有更好的解决方案时找到了这个答案。对我来说这很容易做到,因为我已经在后面的代码中做链接来支持我自己对路线本地化的看法。无论如何,我在这里回复的原因是为此答案提供示例代码: Dim vpd As VirtualPathData = RouteTable.Routes.GetVirtualPath(Nothing, "NamedRoute", Nothing) hyperLink.NavigateUrl = vpd.VirtualPath & "#anchorName"
      【解决方案4】:

      这行得通吗?

      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 占位符之外,则可以避免对该值进行解码,而且这似乎是一种更简洁的方法。

      【讨论】:

      • 这正是我之前尝试过的。但它有两个问题:1)如果您只是在浏览器中输入没有锚点的路由 URL(http://server/Path/SubPath),您会得到 404,因为这不再是有效的路由。 2) # 的不希望出现的 URL 编码仍然发生。
      猜你喜欢
      • 2014-03-03
      • 1970-01-01
      • 2015-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-06
      相关资源
      最近更新 更多