tag route parameter page net form data asp all asp.net-mvc url-routing

asp.net mvc - route - ¿Agregar una barra al final al final de cada url?



tag helpers asp net core (6)

Buena solución limpia, codingbug !!

El único problema con el que me encontré fueron las barras inclinadas dobles para la página de inicio en MVC3.

Ejemplo de maquinilla de afeitar:

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

Vinculado a:
http://mysite.com//

Para solucionar esto modifiqué el reemplazo de 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; }

Tengo un pequeño problema aquí. Necesito agregar una barra diagonal al final de cada url en el sitio en el que estoy trabajando. Definí todos los enlaces dentro del sitio para tener una barra inclinada como:

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

Si bien esto funciona bien, todavía hay un pequeño problema: es con las URL generadas que provienen de llamar a RedirectToAction (). Por ejemplo:

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

Hará que la URL cambie a / registre sin una barra diagonal final. He modificado mi sistema de enrutamiento como tal:

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

¡Aún la barra diagonal final requerida no se agrega automáticamente!
Busqué esta question y esta question pero son totalmente diferentes ya que no estoy usando ninguna biblioteca de reescritura de URL, solo uso el sistema de enrutamiento mvc de asp.net.
Entonces, ¿qué dices chicos?


Hay algunas respuestas realmente buenas, pero aquí hay un código de Controlador MVC de cómo lo implemento de una manera muy simple.

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

Espero que esto ayude a alguien.


La clase RouteCollection ahora tiene un booleano AppendTrailingSlash que puede establecer en verdadero para este comportamiento.


La solución anterior por codingbug es muy agradable. Necesitaba algo muy similar, pero solo para mi URL raíz. Sé que hay posibles problemas con esto, pero esto es lo que hice. Parece funcionar bien en todos mis entornos. Creo que también funciona, porque es solo nuestra página de inicio cuando llegan por primera vez y no tienen la barra de entrenamiento. Ese es el único caso que estaba tratando de evitar. Si eso es lo que quieres evitar, esto funcionará para ti.

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

Si resulta que necesito más que esto. Probablemente usaré el código que proporcionó Codingbug. Hasta entonces, me gusta que sea sencillo.

Nota: cuento con que Home / Index sea eliminado de la URL por el motor de enrutamiento.


Puede crear una nueva Ruta que anule el método GetVirtualPath . En este método, agrega una barra diagonal al VirtualPath . Me gusta esto:

public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values) { VirtualPathData path = base.GetVirtualPath(requestContext, values); if (path != null) path.VirtualPath = path.VirtualPath + "/"; return path; }

Por brevedad publiqué el ejemplo completo en CodePaste.net

Ahora todo lo que tiene que hacer es registrar las rutas con las routes.MapRouteTrailingSlash() lugar de las routes.MapRoute() .

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

La ruta luego agregará una barra a la ruta cuando se GetVirtualPath() . Qué RedirectToAction() hará.

Actualización: debido a que el enlace de CodePaste está inactivo, aquí está el código completo:

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); } }


Sé que hay más respuestas con votos superiores, pero la mejor respuesta no funcionó para mi caso. Necesito decir que encontré una solución mucho más fácil.

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

Esto actuará como barra diagonal "/" en todos los casos.