如何在ASP.NET Core中强制执行小写路由?

时间:2016-04-01 14:20:40

标签: asp.net-core asp.net-core-mvc

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

我无法在ASP.NET Core中找到实现此功能的等效项。我想它会在这里:

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

但是configureRoutes中没有任何内容可以允许它...除非在某个地方找到我在文档中找不到的扩展方法吗?

7 个答案:

答案 0 :(得分:113)

对于ASP.NET Core:

将以下行添加到ConfigureServices类的Startup方法。

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

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

答案 1 :(得分:12)

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

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运行时进行了测试。

答案 2 :(得分:11)

找到了解决方案。

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

services.ConfigureRouting(setupAction =>
{
    setupAction.LowercaseUrls = true;
});

答案 3 :(得分:9)

在ASP.NET Core 2.2中更新

ASP.NET Core 2.2 起,您还可以使用小写的ConstraintMap来使您的路由变为虚线,这将使您的路由/Employee/EmployeeDetails/1/employee/employee-details/1/employee/employeedetails/1

为此,请在ConfigureServices类的Startup方法中:

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

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

并且路由配置应如下:

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

这将使/Employee/EmployeeDetails/1到达/employee/employee-details/1

答案 4 :(得分:1)

对于身份,@Jorge Yanes Diez答案在ASP.NET Core 2.2中不起作用(我认为是2.x ),因此,如果您使用Identity和ASP.NET Core 2.2(2 .x)是解决方法:

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

参考:Configure ASP.NET Core Identity

答案 5 :(得分:0)

我在RegisterRoutes :: RouteConfig上有这个

routes.LowercaseUrls = true;

答案 6 :(得分:0)

值得注意的设置:

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

不影响查询字符串

要确保查询字符串也是小写,请将 options.LowercaseQueryStrings 设置为 true

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

但是,仅当 true 也是 options.LowercaseUrls 时,将此属性设置为 true 才有意义。如果 options.LowercaseQueryStringsoptions.LowercaseUrls,则忽略 false 属性。