“routes.LowercaseUrls = true;”不起作用?

时间:2012-10-02 22:36:45

标签: c# asp.net asp.net-mvc asp.net-mvc-4 .net-4.5

我在默认情况下将路由设置为小写时遇到问题。由于某种原因,它不起作用。我知道我可以将authorizehome设置为自己小写,但Admin部分(区域)仍然会大写。

@Html.ActionLink("Hello World", "Authorize", "Home")
输出到
<a href="/Admin/Home/Authorize">Hello World</a>

区域路线

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

默认路线

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

管理区配置我试过

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

修改

因为看起来这是MVC4的错误 - 当你设置context.Routes.LowercaseUrls = true;并且你有区域/区域context.Routes.LowercaseUrls = true;不会产生任何影响,我们应该在哪里报告它或我们如何解决它?

4 个答案:

答案 0 :(得分:6)

这是与MVC4相关的错误,将在MVC5版本中修复。 Routes.LowercaseUrls不会影响区域。更多信息here

同时你可以使用LowercaseRoutesMVCLowercaseRoutesMVC4如果您需要WebApi支持。

答案 1 :(得分:1)

我尝试 几个 尝试获取此特定的布尔标志,以便在没有运气的情况下使用MVC3项目。我可以使用 ONLY 的方法是创建一个MVC4应用程序项目,并在app start中的RouteConfig.cs文件中设置标志。 真正糟糕的部分是它为我自动降低了整个网站的网址,直到我添加了一个区域,然后它到处都是。一旦我从项目中排除了新添加的区域并重新开始,网址再次降低了。

使用那个标志赢得了一些东西。我建议下载nuget包用于小写网址。看起来好像他们还没有解决新框架这一部分的问题。

抱歉,我无法提供更多帮助。

答案 2 :(得分:1)

更新: 在MVC4应用程序中

创建一个新的空白MVC4应用程序并使用Test.cshtml视图和TestController.cs控制器添加一个区域调用测试。

所以我想出了一些东西......虽然我不确定这是否是一个合理的解决方案。在使用路径注册例程后,拥有项目中的区域不会破坏小写功能。

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

解决方法:

注释掉

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

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

区域控制器操作方法

    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

 <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>

请注意,查询字符串变量不是小写的,也不是seo友好的URL。但它确实找到了视图。这就像我能够使用那个标志并让网址变为小写一样接近。

答案 3 :(得分:-1)

众所周知,LowercaseUrls = true仅适用于.NET4.5,也许您可​​以为小写网址编写一些扩展名。您可以参考making URL lowercase. Any easy or builtin way了解详细信息。