在每个网址的结尾添加斜线?(Add a trailing slash at the end of e

2019-07-05 02:44发布

我这里有一个小问题。 我需要在我工作的网站的每个URL的末尾添加尾部的斜杠。 我定义的站点内的所有链接,尾随的斜杠,像这样:

<a href="/register/">Register</a>

虽然这工作正常还是有一个很小的问题:它是与来自调用RedirectToAction()生成的URL。 例如:

return RedirectToAction("Register", "Users");

会让网址更改为/没有尾随斜线登记。 我修改了路由系统,像这样:

  routes.MapRoute("register",
                        "register/",
                        new {controller = "Users", action = "Register"}
            );

仍然需要的斜线不会被自动添加!
我抬头一看这个问题,而这个问题 ,但是,这些是完全不同的,因为我没有使用任何URL重写库我只是用asp.net mvc的路由系统。
所以,你说什么人?

Answer 1:

该RouteCollection类现在有一个AppendTrailingSlash布尔,你可以设置为true此行为。



Answer 2:

您可以创建一个新的路线将覆盖GetVirtualPath方法。 在此方法添加一个尾部斜杠的VirtualPath 。 像这样:

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

     if (path != null)
         path.VirtualPath = path.VirtualPath + "/";
     return path;
}

为了简便起见我张贴的关于CodePaste.net例如全

现在,所有你需要做的是注册路线routes.MapRouteTrailingSlash()代替routes.MapRoute()

routes.MapRouteTrailingSlash("register",
                             "register",
                             new {controller = "Users", action = "Register"}
);

然后,路线将斜杠添加到路径时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);
    }
}


Answer 3:

漂亮干净的解决方案,codingbug!

只有我遇到的问题是双斜杠结尾在MVC3主页。

剃刀例如:

@Html.ActionLink("Home", "Index", "Home")

链接到:
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;       
}


Answer 4:

通过codingbug上述解决方案是非常好的。 我需要非常相似,但只为我的根URL的东西。 我知道有这种可能出现的问题,但这里是我做过什么。 看来工作在我所有的环境就好了。 我认为它的工作原理也一样,因为只有我们的首页,当他们第一次来,不具备培训斜线。 这是一个情况下,我试图避免。 如果这是你想避免什么,这会为你工作。

  public class HomeController : Controller
  {
    public ActionResult Index()
    {
      if (!Request.RawUrl.Contains("Index") && !Request.RawUrl.EndsWith("/"))
        return RedirectToAction("Index", "Home", new { Area = "" });

如果事实证明,我需要比这更多。 我可能会使用codingbug提供的代码。 在那之前,我喜欢保持简单。

注:我指望首页\指数从由路由引擎的网址删除。



Answer 5:

我知道有更多的upvoted答案,但最好的投答案并没有对我的情况下工作。 需要我说,我发现了一个更容易的解决方案。

routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}/", <-- trailing slash here
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );

这将作为在所有情况下斜杠“/”。



Answer 6:

有一些很好的答案,但这里是我如何在一个非常简单的GET实现它的一些MVC控制器代码。

    public ActionResult Orders()
    {
        if (!Request.Path.EndsWith("/"))
        {
            return RedirectPermanent(Request.Url.ToString() + "/");
        }
        return View();
    }

希望这可以帮助别人。



文章来源: Add a trailing slash at the end of each url?