【问题标题】:"routes.LowercaseUrls = true;" does not work?“路线。小写Urls =真;”不工作?
【发布时间】:2012-09-23 20:18:00
【问题描述】:

我在将路由默认设置为小写时遇到问题。由于某种原因,它不起作用。我知道我可以将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; 并且您有 Area/Areas context.Routes.LowercaseUrls = true; 时不会生效,我们应该在哪里报告它或者我们如何修复它?

【问题讨论】:

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我尝试了 几次 尝试让这个特殊的布尔标志与 MVC3 项目一起工作,但没有成功。我可以让它工作的唯一方法是创建一个 MVC4 应用程序项目并在应用程序启动的 RouteConfig.cs 文件中设置标志。 真正糟糕的部分是它自动为我将整个网站的网址小写,直到我添加了一个区域,然后它到处都坏了。一旦我从项目中排除了新添加的区域并重新运行,网址再次小写。

    使用那个标志有点奇怪。我建议下载用于小写 url 的 nuget 包。似乎他们还没有完全解决新框架这部分的问题。

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

    【讨论】:

    • 我知道这篇文章,但由于我使用的是具有routes.LowercaseUrls = true; 的 .NET 4.5,它应该可以工作。我在问为什么它不起作用。
    • 你运行的是什么 IIS 版本?
    • 检查您是否正在运行 IIS Url Rewrite 模块以及它是否覆盖了此行为
    • 另外,小写字母是否适用于标准路线,而不适用于区域路线?
    • 看来这可能是 .net 代码中的错误。在反编译路由命名空间并查看 NormalizeVirtualPath 函数后,当它从 RoutesCollection 获取 DataTokens 时,它似乎可能会错过 URL 的那部分。如果不完全重新创建和调试到 .net 库中,则无法确定,但在涉及区域时,您似乎不是唯一遇到此问题的人。
    【解决方案3】:

    更新:在一个 MVC4 应用程序中

    创建一个新的空白 MVC4 应用程序并添加一个名为 Test 的区域,其中包含一个 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。但是它确实找到了视图。这与我能够使用该标志并将网址转为小写字母一样接近。

    【讨论】:

    • 嗯,这在某种程度上是一种解决方案,但没有人希望他们的网址在 2012 年看起来像 /test?area=Test
    【解决方案4】:

    据我所知,LowercaseUrls = true 仅在 .NET4.5 中可用,也许您可​​以为小写 url 编写一些扩展。详情可参考making URL lowercase. Any easy or builtin way

    【讨论】:

    • 我将 MVC4 与 .NET 4.5 一起使用。这不是问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-04
    • 2017-10-18
    • 2018-05-15
    • 1970-01-01
    • 1970-01-01
    • 2017-05-10
    • 1970-01-01
    相关资源
    最近更新 更多