如何将尾随斜杠附加到页面路由?

时间:2010-11-11 17:26:19

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

这是一个与此查询完全相同的问题,虽然我的是一个Web窗体场景(在.NET 4中使用路由)而不是MVC。

Add a trailing slash at the end of each url?

由于完整解决方案的链接被破坏,有人提到的解决方案只有一半提供。

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

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

此处删除尾部斜杠,尽管它存在于我的路由表中。

任何人都可以帮助提供一个干净,有效的解决方案吗?理想情况下,就像我在其他Stack Overflow线程中提供的“几乎完整”解决方案一样?

2 个答案:

答案 0 :(得分: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例程中使用'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/

答案 1 :(得分:0)

要使生成的url始终小写并且使用最终的斜杠,我将TidyRouting库添加到我的解决方案中,然后我只需替换&#34; MapRoute&#34;使用新的&#34; MapTidyRoute&#34;。

的方法