.net
  • asp.net
  • url
  • .net-4.0
  • routing
  • 2010-11-11 94 views 2 likes 
    2

    这是一个近乎相同的问题,我对这个查询是一样的,虽然我的是一个Web窗体场景(使用.NET 4中的路由),而不是MVC。如何获得附加到页面路线的尾部斜线?

    Add a trailing slash at the end of each url?

    有人提到有一半不幸的是提供为纽带的完整解决方案的解决方案是坏了。

    目前,当我得到路由URL时,我的页面路由中的任何结尾斜杠都将被删除。

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

    在这里再次尾随斜线被删除,尽管它存在于我的路由表: 当我要使用下列类型的内嵌语法的我的网页形式,这是特别有问题的。

    任何人都可以请帮忙提供一个清洁,有效的解决这个问题?理想情况下,就像我上面提到的另一个Stack Overflow线程中提供的'接近完成'的解决方案一样?

    回答

    3

    我现在已经找到了解决我原来的问题。我发现了下面的文章,它描述了如何确保所有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内使用“图路线”套路,我打电话给我的新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/

    +0

    在发布问题和答案之间,您是否偶然从asp.net切换到mvc? routes.MapRouteLowercase(...)显然适用于mvc控制器/操作。 – secretwep 2016-04-12 20:53:44

    0

    使生成的URL始终小写,并用最后结尾的斜线我的TidyRouting库添加到我的解决方案,那么我只需用新的“MapTidyRoute”替换“MapRoute”方法即可。

    相关问题