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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top