如何在 ASP.NET 核心中实施小写路由?

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

我在 ASP.NET Core 中找不到类似的方法来实现这一点,我认为应该是这里:

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

但是 configureRoutes中似乎没有允许它... ... 除非有一个扩展方法,我在文档中可能找不到?

47335 次浏览

找到解决办法了。

在程序集 Microsoft.AspNet.RoutingMicrosoft.Extensions.DependencyInjection名称空间中,您可以在 ConfigureServices(IServiceCollection services)方法中完成以下操作:

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

对于 ASP.NET 核心:

Startup类的 ConfigureServices方法添加以下代码行之一:

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

或者

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

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

正如其他答案所表明的那样,他补充道:

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

之前

services.AddMvc(...)

工程伟大,但我还想补充的是,如果你使用标识,你还需要:

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

在 ASP.NET 核心版本 > = 2.2中更新

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:

Startup类的 ConfigureServices方法中:

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

路线配置应该如下:

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:

Startup类的 ConfigureServices方法中:

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:

Startup类的 ConfigureServices方法中:

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

路线配置应该如下:

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:

Startup类的 ConfigureServices方法中:

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

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

Startup类的 ConfigureServices方法中:

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

这将使 /Employee/EmployeeDetails/1路由到 /employee/employee-details/1

对于身份,@ Jorge Yanes Diez的答案在 ASP.NET Core 2.2(我想是2)中不起作用,所以如果你使用 Identity 和 ASP.NET Core 2.2(2.x) ,这里有一个解决方案:

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

档号: 配置 ASP.NET 核心标识

我在 RegisterRoutes: : RouteConfig 上看到过这个:

LowercaseUrls = true;

值得注意的是:

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

不影响查询字符串

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

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

但是,只有当 options.LowercaseUrls也是 true时,才需要将此属性设置为 true。如果 options.LowercaseUrlsfalse,则忽略 options.LowercaseQueryStrings属性。