122

routes.LowercaseUrls = true;在 ASP.NET 4 中,这与在应用程序的RegisterRoutes处理程序中一样简单。

我在 ASP.NET Core 中找不到实现此目的的等价物。我想它会在这里:

app.UseMvc(configureRoutes =>
{
    configureRoutes.MapRoute("Default", "{controller=App}/{action=Index}/{id?}");
});

但是configureRoutes看起来没有任何东西允许它......除非在某个地方有一个我在文档中找不到的扩展方法?

4

7 回答 7

261

对于 ASP.NET 核心:

将以下行之一添加到类的ConfigureServices方法中Startup

services.AddRouting(options => options.LowercaseUrls = true);

或者

services.Configure<RouteOptions>(options => options.LowercaseUrls = true); 

感谢 Skorunka 作为评论的回答。我认为值得推广到一个实际的答案。

于 2016-08-24T02:06:23.583 回答
52

更新 ASP.NET Core 版本 >= 2.2

ASP.NET Core 2.2开始,您还可以使用小写字母将您的路由设为虚线ConstraintMap,这将使您的路由/Employee/EmployeeDetails/1指向/employee/employee-details/1而不是/employee/employeedetails/1.

为此,首先创建的SlugifyParameterTransformer类应该如下:

public class SlugifyParameterTransformer : IOutboundParameterTransformer
{
    public string TransformOutbound(object value)
    {
        // Slugify value
        return value == null ? null : Regex.Replace(value.ToString(), "([a-z])([A-Z])", "$1-$2").ToLower();
    }
}

对于 ASP.NET Core 2.2 MVC:

在类的ConfigureServices方法中Startup

services.AddRouting(option =>
{
    option.ConstraintMap["slugify"] = typeof(SlugifyParameterTransformer);
});

并且Route配置应该如下:

app.UseMvc(routes =>
{
     routes.MapRoute(
        name: "default",
        template: "{controller:slugify}/{action:slugify}/{id?}",
        defaults: new { controller = "Home", action = "Index" });
});

对于 ASP.NET Core 2.2 Web API:

在类的ConfigureServices方法中Startup

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc(options => 
    {
        options.Conventions.Add(new RouteTokenTransformerConvention(new SlugifyParameterTransformer()));
    }).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}

对于 ASP.NET Core >=3.0 MVC:

在类的ConfigureServices方法中Startup

services.AddRouting(option =>
{
    option.ConstraintMap["slugify"] = typeof(SlugifyParameterTransformer);
});

并且Route配置应该如下:

app.UseEndpoints(endpoints =>
{
      endpoints.MapAreaControllerRoute(
          name: "AdminAreaRoute",
          areaName: "Admin",
          pattern: "admin/{controller:slugify=Dashboard}/{action:slugify=Index}/{id:slugify?}");

      endpoints.MapControllerRoute(
          name: "default",
          pattern: "{controller:slugify}/{action:slugify}/{id:slugify?}",
          defaults: new { controller = "Home", action = "Index" });
});

对于 ASP.NET Core >=3.0 Web API:

在类的ConfigureServices方法中Startup

services.AddControllers(options => 
{
    options.Conventions.Add(new RouteTokenTransformerConvention(new SlugifyParameterTransformer()));
});

对于 ASP.NET Core >=3.0 Razor 页面:

在类的ConfigureServices方法中Startup

services.AddRazorPages(options => 
{
    options.Conventions.Add(new PageRouteTransformerConvention(new SlugifyParameterTransformer()));
})

这将使/Employee/EmployeeDetails/1路线/employee/employee-details/1

于 2018-12-18T18:22:35.320 回答
24

正如其他答案所示,添加:

services.Configure<RouteOptions>(options => options.LowercaseUrls = true);

services.AddMvc(...)

效果很好,但我还想补充一点,如果您使用 Identity,您还需要:

services.AddIdentity<IdentityUser, IdentityRole>(options =>
{
    var appCookie = options.Cookies.ApplicationCookie;
    appCookie.LoginPath = appCookie.LoginPath.ToString().ToLowerInvariant();
    appCookie.LogoutPath = appCookie.LogoutPath.ToString().ToLowerInvariant();
    appCookie.ReturnUrlParameter = appCookie.ReturnUrlParameter.ToString().ToLowerInvariant();
});

显然,如果需要,请将两者替换IdentityUserIdentityRole您自己的类。

我刚刚使用 .NET Core SDK 1.0.4 和 1.0.5 运行时对此进行了测试。

于 2017-05-26T13:26:04.540 回答
14

找到了解决方案。

在程序集:Microsoft.AspNet.RoutingMicrosoft.Extensions.DependencyInjection命名空间中,您可以在ConfigureServices(IServiceCollection services)方法中执行此操作:

services.ConfigureRouting(setupAction =>
{
    setupAction.LowercaseUrls = true;
});
于 2016-04-01T14:24:16.360 回答
3

值得注意的是,设置:

services.Configure<RouteOptions>(options => options.LowercaseUrls = true);

不影响查询字符串

要确保查询字符串也是小写的,请将其设置options.LowercaseQueryStringstrue

services.Configure<RouteOptions>(options => 
{ 
    options.LowercaseUrls = true; 
    options.LowercaseQueryStrings = true;
});

但是,将此属性设置为仅在is alsotrue时才有意义。如果is ,则忽略属性。options.LowercaseUrlstrueoptions.LowercaseQueryStringsoptions.LowercaseUrlsfalse

于 2021-08-06T11:31:05.753 回答
1

对于身份,@Jorge Yanes DiezASP.NET Core 2.2的回答在(我认为是 2.x )中不起作用,所以如果您使用 Identity 和 ASP.NET Core 2.2 (2.x),这里是解决方案:

services.ConfigureApplicationCookie(options =>
{
    options.LoginPath = "/account/login";
    options.ReturnUrlParameter = "returnurl";
    ...
});

参考:配置 ASP.NET Core 标识

于 2019-01-09T19:54:42.623 回答
-1

我在 RegisterRoutes::RouteConfig 上有这个:

routes.LowercaseUrls = true;

于 2019-08-11T00:31:13.990 回答