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


90

在ASP.NET 4中,这就像routes.LowercaseUrls = true;RegisterRoutes应用程序的处理程序中一样容易。

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

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

但是configureRoutes看起来没有什么允许它...除非我可能在文档中找不到某个扩展方法?

Answers:


192

对于ASP.NET Core:

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

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

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


35
值得一提的,你应该把此之前,你实际调用AddMvc()你的Startup.ConfigureServices()方法。AddRouting()也可以AddMvc()使用Try方法的变体来调用该方法,以将依赖项添加到服务集合中。因此,当看到路由依赖性已经添加时,它将跳过AddMvc()设置逻辑的那部分。
尼克·阿尔布雷希特

由于我的是在asp 4向核心过渡期间,因此将其切换为正确答案。
mariocatch

31

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

并且路由配置应如下:

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

并且路由配置应如下:

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


我也尝试了此代码和正式的Microsoft代码,但是“ slugify”参数转换器无效。路由系统只会忽略它(因此URL不会替换为破折号)。为了检查自己,我将记录器放入TransformOutbound()方法中,但没有来自那里的调用。
user3172616

好的!让我检查一下!
TanvirArjel

@ user3172616我现在检查了!它按预期工作!就像生成路线一样employee-details。您能告诉我您的配置吗?
TanvirArjel

@ user3172616您是否在测试的路由上使用属性路由?
TanvirArjel

我在Visual Studio中全新的v2.2核心解决方案上使用标准路由方法(而非属性路由)。有两个屏幕截图(c#代码和.cshtml代码)。我试图以不同的方式生成链接,但没有任何效果。imgur.com/a/L8dCF6c
user3172616

20

如其他答案所示,添加:

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

很显然,更换两个IdentityUser,且IdentityRole如果需要,用你自己的类。

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


Configure <RouteOptions>()是最好的答案,恕我直言:微小而直截了当(在mvc core 3.1上进行了测试)
T型Moty

12

找到了解决方案。

在Assembly:Microsoft.AspNet.RoutingMicrosoft.Extensions.DependencyInjection命名空间中,可以在ConfigureServices(IServiceCollection services)方法中执行以下操作:

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

15
对于ASP NET MVC CORE:services.AddRouting(options => {options.LowercaseUrls = true;});
SkorunkaFrantišek'16

Microsoft.AspNetCore.Routing.dll中的Microsoft.Extensions.DependencyInjection
SkorunkaFrantišek16年

3
在RTM之前是这样,现在您应该使用.AddRouting而不是
.ConfigureRouting


0

我在RegisterRoutes :: RouteConfig上有这个:

route.LowercaseUrls = true;

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.