【问题标题】:How to get a trailing slash appended to page routes?如何获得附加到页面路由的斜杠?
【发布时间】:2011-05-08 14:55:00
【问题描述】:

这是我遇到的与此查询几乎相同的问题,尽管我的是 Web 窗体场景(在 .NET 4 中使用路由)而不是 MVC。

Add a trailing slash at the end of each url?

不幸的是,有人提到的解决方案只提供了一半,因为完整解决方案的链接已损坏。

目前,当我获得路由 url 时,我的页面路由中的任何尾随斜杠都会被删除。 当我想在我的网络表单上使用以下类型的内联语法时,这尤其成问题:

<a runat="server" href='<%$RouteUrl:RouteName=Posts %>'>

这里再次删除了尾部斜杠,尽管它存在于我的路由表中。

谁能帮助提供一个干净、有效的解决方案来解决这个问题?理想情况下,就像我上面提到的另一个 Stack Overflow 线程中提供的“几乎完整”的解决方案?

【问题讨论】:

    标签: .net asp.net url .net-4.0 routing


    【解决方案1】:

    我现在找到了原始问题的解决方案。我发现以下文章描述了如何确保所有 Url 都是小写的,所以我只使用了这个示例代码,但在它执行 ToLowerInvariant() 的位置附加了一个斜杠。

    所以,我的 2 个辅助类现在看起来像这样:

    public class LowercaseRoute : System.Web.Routing.Route
    {
        public LowercaseRoute(string url, IRouteHandler routeHandler)
            : base(url, routeHandler) { }
        public LowercaseRoute(string url, RouteValueDictionary defaults, IRouteHandler routeHandler)
            : base(url, defaults, routeHandler) { }
        public LowercaseRoute(string url, RouteValueDictionary defaults, RouteValueDictionary constraints, IRouteHandler routeHandler)
            : base(url, defaults, constraints, routeHandler) { }
        public LowercaseRoute(string url, RouteValueDictionary defaults, RouteValueDictionary constraints, RouteValueDictionary dataTokens, IRouteHandler routeHandler)
            : base(url, defaults, constraints, dataTokens, routeHandler) { }
    
        public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
        {
            VirtualPathData path = base.GetVirtualPath(requestContext, values);
    
            if (path != null)
                path.VirtualPath = path.VirtualPath.ToLowerInvariant() + "/";
    
            return path;
        }
    }
    
    public static class RouteCollectionExtensions
    {
        public static void MapRouteLowercase(this RouteCollection routes, string name, string url, object defaults)
        {
            routes.MapRouteLowercase(name, url, defaults, null);
        }
    
        public static void MapRouteLowercase(this RouteCollection routes, string name, string url, object defaults, object constraints)
        {
            if (routes == null)
                throw new ArgumentNullException("routes");
    
            if (url == null)
                throw new ArgumentNullException("url");
    
            var route = new LowercaseRoute(url, new MvcRouteHandler())
            {
                Defaults = new RouteValueDictionary(defaults),
                Constraints = new RouteValueDictionary(constraints)
            };
    
            if (String.IsNullOrEmpty(name))
                routes.Add(route);
            else
                routes.Add(name, route);
        }
    }
    

    在我的 global.asax 中,我没有在我的 RegisterRoutes 例程中使用“MapRoute”,而是调用我的新 MapRouteLowercase 方法(传递相同的参数),例如

    routes.MapRouteLowercase("Default", "{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = UrlParameter.Optional });
    

    我得到这个代码的原始文章可以在这里找到:

    http://goneale.com/2008/12/19/lowercase-route-urls-in-aspnet-mvc/

    【讨论】:

    • 在您发布问题和您的答案之间,您是否偶然从 asp.net 切换到了 mvc? routes.MapRouteLowercase(...) 显然适用于 mvc 控制器/动作。
    【解决方案2】:

    为了使生成的 url 始终小写并带有最后的斜杠,我将 TidyRouting 库添加到我的解决方案中,然后我只需将“MapRoute”方法替换为新的“MapTidyRoute”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-04
      • 1970-01-01
      • 2016-05-19
      • 1970-01-01
      • 2016-04-09
      • 1970-01-01
      • 2014-01-10
      相关资源
      最近更新 更多