18

默认情况下,我无法将路由设置为小写。由于某种原因,它不起作用。我知道我可以设置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

4 回答 4

6

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

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

于 2013-10-16T12:53:00.317 回答
1

更新:在 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-10-15T19:18:17.443 回答
1

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

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

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

于 2012-10-11T12:55:43.933 回答
-1

据我所知,LowercaseUrls = true仅在 .NET4.5 中可用,也许您可​​以为小写 url 编写一些扩展。您可以参考使 URL 小写。任何简单或内置的详细信息方式。

于 2013-04-23T07:27:08.530 回答