"Rutas.lowerCaseUrls = true;" ¿No funciona?
-
12-12-2019 - |
Pregunta
Tengo problemas para configurar mis rutas en minúsculas de forma predeterminada.Por alguna razón no funciona.Sé que puedo configurar authorize
y home
ponerme en minúsculas, pero el Admin
la parte (área) seguirá estando en mayúscula.
@Html.ActionLink("Hello World", "Authorize", "Home")
salidas a
<a href="/Admin/Home/Authorize">Hello World</a>
Ruta de la zona
public override void RegisterArea(AreaRegistrationContext context)
{
context.Routes.LowercaseUrls = true;
context.MapRoute(
"Admin_default",
"Admin/{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional },
new string[] { "OR.Areas.Admin.Controllers" }
);
context.Routes.LowercaseUrls = true;
}
Ruta por defecto
public static void RegisterRoutes(RouteCollection routes)
{
routes.LowercaseUrls = true;
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.LowercaseUrls = true;
routes.MapRoute(
name: "Localization",
url: "{lang}/{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
namespaces: new string[] { "OR.Controllers" }
);
routes.LowercaseUrls = true;
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
namespaces: new string[] { "OR.Controllers" }
);
routes.LowercaseUrls = true;
}
Configuraciones del área de administración que probé
// admin/Home/Authorize
public override void RegisterArea(AreaRegistrationContext context)
{
context.Routes.LowercaseUrls = true;
context.MapRoute(
"Admin_default",
"{area}/{controller}/{action}/{id}",
new { area = "admin", controller = "home", action = "Index", id = UrlParameter.Optional },
new string[] { "ORMebeles.Areas.Admin.Controllers" }
);
context.Routes.LowercaseUrls = true;
}
// admin/Home/Authorize
public override void RegisterArea(AreaRegistrationContext context)
{
context.Routes.LowercaseUrls = true;
context.MapRoute(
"Admin_default",
"admin/{controller}/{action}/{id}",
new { controller = "home", action = "Index", id = UrlParameter.Optional },
new string[] { "ORMebeles.Areas.Admin.Controllers" }
);
context.Routes.LowercaseUrls = true;
}
Editar
Como parece, esto es un error con MVC4, cuando configuras context.Routes.LowercaseUrls = true;
y tienes Área/Áreas context.Routes.LowercaseUrls = true;
no tendrá ningún efecto, ¿dónde debemos informarlo o cómo podemos solucionarlo?
Solución
Este es un error relacionado con MVC4 y se solucionará en la versión MVC5. Routes.LowercaseUrls
No afecta áreas.Más información aquí.
Mientras tanto puedes usar RutasMVC en minúsculas oRutas en minúsculasMVC4 si necesita soporte WebApi.
Otros consejos
Lo intenté Varios intenta hacer que este indicador booleano en particular funcione con un proyecto MVC3 sin suerte.El SOLO La forma en que pude hacerlo funcionar fue crear un proyecto de aplicación MVC4 y configurar la bandera en el archivo RouteConfig.cs al iniciar la aplicación. La parte realmente mala ¿Me puso automáticamente en minúsculas las URL del sitio hasta que agregué un área y luego se rompió en todas partes?Una vez que excluí el área recién agregada del proyecto y volví a ejecutar, las URL volvieron a estar en minúsculas.
Algo anda mal con el uso de esa bandera.Recomendaría descargar el paquete nuget para URL en minúsculas.Parece como si no hubieran resuelto los problemas en esta parte del nuevo marco.
Lo siento, no pude ser de más ayuda.
ACTUALIZAR: EN UNA aplicación MVC4
Cree una nueva aplicación MVC4 en blanco y agregue un área llamada Prueba, con una vista Test.cshtml y un controlador TestController.cs.
Entonces descubrí algo...aunque no estoy seguro de que sea una solución razonable.Después de jugar con las rutinas de registro de rutas, tener las áreas en el proyecto no rompe la funcionalidad de minúsculas.
namespace MvcApplication1.Areas.Test
{
public class TestAreaRegistration : AreaRegistration
{
public override string AreaName
{
get
{
return "Test";
}
}
public override void RegisterArea(AreaRegistrationContext context)
{
//This line breaks the functionality in the area registration.
context.MapRoute(
"Test_default", // Route name
"Test/{controller}/{action}/{id}", // URL with parameters
new { controller = "Test", action = "Index", id = "" }, // Parameter defaults
new string[] { "MvcApplication1.Areas.Test.Controllers" } //namespace
);
}
}
}
Una solución alternativa:
Comenta las líneas
//context.Routes.LowercaseUrls = true;
//context.MapRoute(
// "Test_default", // Route name
// "Test/{controller}/{action}/{id}", // URL with parameters
// new { controller = "Test", action = "Index", id = "" }, // Parameter defaults
// new string[] { "MvcApplication1.Areas.Test.Controllers" } //namespace
// );
En RouteConfig.cs
namespace MvcApplication1
{
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.LowercaseUrls = true;
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
routes.MapRoute(
"Test_default", // Route name
"Test/{controller}/{action}/{id}", // URL with parameters
new { controller = "Test", action = "Index", id = "" }, // Parameter defaults
new string[] { "MvcApplication1.Areas.Test.Controllers" } //namespace
);
}
}
}
En el método de acción del controlador de área
public ActionResult Index()
{
// Key if statement to make sure the area maps correctly
if (!this.ControllerContext.RouteData.DataTokens.ContainsKey("area"))
{
this.ControllerContext.RouteData.DataTokens.Add("area", "Test");
}
return View("Test");
}
HTML resultante para los enlaces en la página principal del proyecto.
<ul id="menu">
<li><a href="/">Home</a></li>
<li><a href="/home/about">About</a></li>
<li><a href="/home/contact">Contact</a></li>
<li><a href="/test?area=Test">Test</a></li>
</ul>
Sin embargo, tenga en cuenta que las variables de la cadena de consulta no están en minúsculas y no es una URL compatible con SEO.Sin embargo, encuentra la vista.Esto es lo más cerca que he podido llegar usando esa bandera y haciendo que las URL vayan a minúsculas.
Como sé, LowercaseUrls = true
solo está disponible en .NET4.5, tal vez puedas escribir algunas extensiones para URL en minúsculas.puedes referirte a poner la URL en minúsculas.Cualquier forma fácil o integrada para información detallada.