ASP.NET Coreで小文字のルーティングをどのように適用しますか?


93

ASP.NET 4では、これは限り簡単にしたroutes.LowercaseUrls = true;RegisterRoutesのアプリのためのハンドラ。

これを実現するための同等のものがASP.NETCoreで見つかりません。私はそれがここにあると思います:

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

しかしconfigureRoutes、それを許可するように見えるものは何もありません...おそらくドキュメントで見つけることができない拡張メソッドがどこかにない限り?

回答:


201

ASP.NET Coreの場合:

クラスのConfigureServicesメソッドに次の行を追加しますStartup

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

コメントとして答えてくれたSkorunkaに感謝します。実際の答えに昇格する価値があると思いました。


35
実際にメソッドを呼び出す前に、これを配置する必要があることに注意AddMvc()してくださいStartup.ConfigureServices()AddRouting()これは、サービスコレクションに依存関係を追加するためのメソッドAddMvc()Tryバリアントを使用して呼び出されます。したがって、ルーティングの依存関係がすでに追加されていることを確認すると、AddMvc()セットアップロジックのその部分をスキップします。
Nick Albrecht

私はasp4からコアへの移行中にいたので、これを正しい答えに切り替えます。
mariocatch 2017

@NickAlbrecht(少なくともASP.NET Core 5.0以降)前に呼び出されても後に呼び出されても違いはないようです。AddRouting()はとにかく2回呼び出されるので、どちらの順序でもかまいません。
トーマスレベ

これは.NETCore3.xを中心に行われたと思います。彼らは、ルーティングがMVCにバンドルされるのではなく、スタンドアロン機能になるように変更しました。ルーティングがAddMvc(またはAddControllersWithViewsRazorPagesが必要ない場合は)から呼び出されることはもうないと思います。したがって、順序は、AspNetCore 2を使用している場合にのみ重要です(これが1.xのオプションであったかどうかを思い出さないでください)。ただし、小文字の動作は2つの設定に分割されていたため、完全に小文字のアドレスが必要な場合は、との両方LowercaseUrlsLowercaseQueryStringsに設定する必要がありますtrue
ニック・アルブレヒト

37

ASP.NETCoreバージョン> = 2.2での更新

ASP.NETコア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 Pagesの場合:

クラスのConfigureServicesメソッドではStartup

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

これはへの/Employee/EmployeeDetails/1ルートを作ります/employee/employee-details/1


このコードと公式のMicrosoftコードも試しましたが、「slugify」パラメータートランスフォーマーは効果がありません。ルーティングシステムでは無視されます(したがって、URLは破線に置き換えられません)。自分自身をチェックするために、ロガーをTransformOutbound()メソッドに入れましたが、そこからの呼び出しはありません。
user31726 1619年

はい!確認させてください!
TanvirArjel

@ user3172616今チェックしました!期待どおりに機能しています!としてルートを生成するようなものemployee-detailsです。設定を教えていただけませんか?
TanvirArjel

@ user3172616テストしたルートで属性ルーティングを使用していますか?
TanvirArjel

Visual Studioの新しいコアv2.2ソリューションでは、標準のルーティングアプローチ(属性ルーティングではない)を使用しています。2つのスクリーンショットがあります(c#コードと.cshtmlコード)。さまざまな方法でリンクを生成しようとしましたが、効果はありませんでした。imgur.com/a/L8dCF6c
user31726

20

他の回答が示すように、次を追加します。

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

そして、明らかに、両方を交換IdentityUserし、IdentityRole必要に応じて独自のクラスで。

これを.NETCore SDK1.0.4と1.0.5ランタイムでテストしました。


設定<routeoptionsはは>()最良の答えの私見です:小さなとストレートポイントに(MVCコア3.1でテスト)
T-moty

12

解決策を見つけました。

アセンブリ:Microsoft.AspNet.Routing、およびMicrosoft.Extensions.DependencyInjection名前空間では、ConfigureServices(IServiceCollection services)メソッドでこれを行うことができます。

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

15
ASP NET MVC COREの場合:services.AddRouting(options => {options.LowercaseUrls = true;});
–SkorunkaFrantišek 2016

Microsoft.AspNetCore.Routing.dllのMicrosoft.Extensions.DependencyInjection
SkorunkaFrantišek 2016

3
これはRTMの前は真実でしたが、今では.ConfigureRoutingの代わりに.AddRoutingを使用する必要があります
Yves

1

IDの場合、@ Jorge Yanes Diezの回答はASP.NET Core 2.22.xだと思います)では機能しないため、IdentityとASP.NET Core 2.2(2.x)を使用する場合の解決策は次のとおりです。

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

参照:ASP.NETコアIDを構成する


0

私はRegisterRoutes :: RouteConfigでこれを持っていました:

routers.LowercaseUrls = true;

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.