やりたいこと
ASP.NET CoreでWeb APIを作成した時は、標準ではURLがPascal Caseになります。
例えば、以下の例では、/SubscriptionManagement/ListAll
がURLのパスになります。
public class SubscriptionManagementController : Controller
{
[HttpGet("[controller]/[action]")]
public IActionResult ListAll()
{
return ControllerContext.MyDisplayRouteInfo();
}
}
これを/subscription-management/list-all
にようなケバブケース(kebab case)にしたい場合があります。
ケバブケースにする方法
公式ページの
ASP.NET Core でのコントローラー アクションへのルーティング の「パラメーター トランスフォーマーを使用してトークンの置換をカスタマイズする」に書かれています。
IOutboundParameterTransformer インターフェースを実装
まず、やることは、IOutboundParameterTransformer インターフェースを実装したクラスを定義します。公式ページのコードそのままです。
using System.Text.RegularExpressions;
public class SlugifyParameterTransformer : IOutboundParameterTransformer
{
public string? TransformOutbound(object? value)
{
if (value == null) { return null; }
return Regex.Replace(value.ToString()!,
"([a-z])([A-Z])",
"$1-$2",
RegexOptions.CultureInvariant,
TimeSpan.FromMilliseconds(100)).ToLowerInvariant();
}
}
Program.cs でSlugifyParameterTransformerを追加
そして、Program.cs に以下のようなコードを追加します(.NET 6の場合)。
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllersWithViews(options =>
{
options.Conventions.Add(new RouteTokenTransformerConvention(
new SlugifyParameterTransformer()));
});
これにより、パラメーター トランスフォーマーをアプリケーションのすべての属性ルートに適用します。
.NET 5、.NET Core 3.1の場合は、Startup.csのConfigureServicesメソッドで、以下を追加します。
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews(options =>
{
options.Conventions.Add(new RouteTokenTransformerConvention(
new SlugifyParameterTransformer()));
});
}
これで、ケバブケース(kebab case)になります。