在每个网址的末尾添加一个尾部斜杠?

Gal*_*you 30 asp.net-mvc url-routing

我这里有点问题.我需要在我正在处理的网站的每个网址末尾添加一个尾部斜杠.我将网站内的所有链接定义为具有如下的尾部斜杠:

<a href="/register/">Register</a>
Run Code Online (Sandbox Code Playgroud)

虽然这很好用,但还有一个小问题:它来自调用RedirectToAction()的生成的url.例如:

return RedirectToAction("Register", "Users");
Run Code Online (Sandbox Code Playgroud)

将导致url更改为/ register,没有尾部斜杠.我修改了我的路由系统:

  routes.MapRoute("register",
                        "register/",
                        new {controller = "Users", action = "Register"}
            );
Run Code Online (Sandbox Code Playgroud)

仍然不会自动添加所需的尾部斜杠!
我查了这个问题和这个问题,但这些完全不同,因为我没有使用任何url重写库,我只是使用asp.net mvc路由系统.
那么你们怎么说呢?

Sch*_*dty 48

RouteCollection类现在有一个AppendTrailingSlash布尔值,您可以为此行为设置为true.

  • `AppendTrailingSlash`不会重写路由. (7认同)

aol*_*lde 20

您可以创建一个覆盖该GetVirtualPath方法的新Route .在此方法中,您将添加一个尾部斜杠VirtualPath.像这样:

public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
{
     VirtualPathData path = base.GetVirtualPath(requestContext, values);

     if (path != null)
         path.VirtualPath = path.VirtualPath + "/";
     return path;
}
Run Code Online (Sandbox Code Playgroud)

为简洁起见,我在CodePaste.net上发布了整个示例

现在你所要做的就是用routes.MapRouteTrailingSlash()而不是注册路线routes.MapRoute().

routes.MapRouteTrailingSlash("register",
                             "register",
                             new {controller = "Users", action = "Register"}
);
Run Code Online (Sandbox Code Playgroud)

然后,路径将GetVirtualPath()在调用时向路径添加斜杠.哪个RedirectToAction()会做.

更新:因为CodePaste链接已关闭,以下是完整代码:

public class TrailingSlashRoute : Route {
    public TrailingSlashRoute(string url, IRouteHandler routeHandler)
        : base(url, routeHandler) {}

    public TrailingSlashRoute(string url, RouteValueDictionary defaults, IRouteHandler routeHandler)
        : base(url, defaults, routeHandler) {}

    public TrailingSlashRoute(string url, RouteValueDictionary defaults, RouteValueDictionary constraints,
                          IRouteHandler routeHandler)
        : base(url, defaults, constraints, routeHandler) {}

    public TrailingSlashRoute(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 + "/";
        return path;
    }
}

public static class RouteCollectionExtensions {
    public static void MapRouteTrailingSlash(this RouteCollection routes, string name, string url, object defaults) {
        routes.MapRouteTrailingSlash(name, url, defaults, null);
    }

    public static void MapRouteTrailingSlash(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 TrailingSlashRoute(url, new MvcRouteHandler())
                    {
                        Defaults = new RouteValueDictionary(defaults),
                        Constraints = new RouteValueDictionary(constraints)
                    };

        if (String.IsNullOrEmpty(name))
            routes.Add(route);
        else
            routes.Add(name, route);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 在帖子中添加了代码.希望有所帮助!抱歉死链接. (4认同)

Aka*_*oni 5

干净的解决方案,编码!

我遇到的唯一问题是MVC3中主页的双尾斜杠.

剃刀的例子:

@Html.ActionLink("Home", "Index", "Home")
Run Code Online (Sandbox Code Playgroud)

链接到:http:
//mysite.com//

为了解决这个问题,我调整了GetVirtualPath覆盖:

public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
{       
    VirtualPathData path = base.GetVirtualPath(requestContext, values);       

    if (path != null && path.VirtualPath != "")       
        path.VirtualPath = path.VirtualPath + "/";       
    return path;       
}
Run Code Online (Sandbox Code Playgroud)