C# &引用;routes.LowercaseUrls=true&引用;不起作用?

C# &引用;routes.LowercaseUrls=true&引用;不起作用?,c#,asp.net,asp.net-mvc,asp.net-mvc-4,.net-4.5,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 4,.net 4.5,默认情况下,我无法将路由设置为小写。由于某种原因,它不起作用。我知道我可以自己将authorize和home设置为小写,但Admin部分(区域)仍将大写 @Html.ActionLink(“你好,世界”,“授权”,“主页”) 输出到 区域路线 public override void RegisterArea(AreaRegistrationContext context) { context.Routes.LowercaseUrls = true;

默认情况下,我无法将路由设置为小写。由于某种原因,它不起作用。我知道我可以自己将
authorize
home
设置为小写,但
Admin
部分(区域)仍将大写

@Html.ActionLink(“你好,世界”,“授权”,“主页”)

输出到

区域路线

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;
        }
管理区配置我试过了 编辑 这似乎是MVC4的错误——当您设置
context.Routes.LowercaseUrls=true时和区域
context.Routes.LowercaseUrls=true不会起任何作用,我们应该在哪里报告它,或者如何修复它?

我尝试了几次尝试让这个特定的布尔标志与MVC3项目一起工作,但没有成功。我能让它工作的唯一方法是创建一个MVC4应用程序项目,并在app start的RouteConfig.cs文件中设置标志最糟糕的部分是,在我添加了一个区域之前,它会自动将整个站点的URL小写,然后到处都是。一旦我从项目中排除了新添加的区域并重新运行,URL再次被小写

使用那面旗子有点不对劲。我建议下载小写URL的nuget包。似乎他们还没有完全解决新框架这一部分的问题

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

更新: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。然而,它确实找到了视图。这是我使用该标志并使URL变为小写的最接近的结果。

正如我所知,
LowercaseUrls=true
仅在.NET4.5中可用,也许您可以为小写URL编写一些扩展。有关详细信息,请参阅。

这是与MVC4相关的错误,将在MVC5版本中修复<代码>路线。小写欧元不影响区域。更多信息

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

我知道这篇文章,但因为我使用的是.NET 4.5,它有
routes.LowercaseUrls=true它应该可以工作。我在问为什么它不工作。您正在运行什么IIS版本?检查您是否正在运行IIS Url重写模块,以及它是否覆盖此行为。此外,小写是否在标准路由上工作,而不是在区域路由上工作?这似乎可能是.net代码中的一个错误。在对路由名称空间进行反编译并查看NormalizeVirtualPath函数之后,当它从RouteCollection获取数据令牌时,似乎可能会错过url的该部分。如果不在.net库中完全重新创建和调试,就无法确定,但在涉及区域时,您似乎不是唯一存在此问题的人。这是一种解决方案,但没有人希望他们的URL在2012年看起来像
/test?area=test
。我在.net 4.5中使用MVC4。这不是问题所在。可能是重复的
 <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>