我这里有一个小问题。 我需要在我工作的网站的每个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的路由系统。
所以,你说什么人?
该RouteCollection类现在有一个AppendTrailingSlash布尔,你可以设置为true此行为。
您可以创建一个新的路线将覆盖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);
}
}
漂亮干净的解决方案,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;
}
通过codingbug上述解决方案是非常好的。 我需要非常相似,但只为我的根URL的东西。 我知道有这种可能出现的问题,但这里是我做过什么。 看来工作在我所有的环境就好了。 我认为它的工作原理也一样,因为只有我们的首页,当他们第一次来,不具备培训斜线。 这是一个情况下,我试图避免。 如果这是你想避免什么,这会为你工作。
public class HomeController : Controller
{
public ActionResult Index()
{
if (!Request.RawUrl.Contains("Index") && !Request.RawUrl.EndsWith("/"))
return RedirectToAction("Index", "Home", new { Area = "" });
如果事实证明,我需要比这更多。 我可能会使用codingbug提供的代码。 在那之前,我喜欢保持简单。
注:我指望首页\指数从由路由引擎的网址删除。
我知道有更多的upvoted答案,但最好的投答案并没有对我的情况下工作。 需要我说,我发现了一个更容易的解决方案。
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}/", <-- trailing slash here
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
这将作为在所有情况下斜杠“/”。
有一些很好的答案,但这里是我如何在一个非常简单的GET实现它的一些MVC控制器代码。
public ActionResult Orders()
{
if (!Request.Path.EndsWith("/"))
{
return RedirectPermanent(Request.Url.ToString() + "/");
}
return View();
}
希望这可以帮助别人。