ASP.NET Core 7から使えるようになったIParsableを使ってモデルバインドをしてみます。
やること
コントローラのアクションで、"2022/12/31,2023/01/01"のような文字列をDateRangeという日付の区間を表すクラスにバインドして受け取れるようにしてみます。
// string => DateRangeにバインドする [HttpGet("DateRange")] public IActionResult GetDateRange([FromQuery] DateRange dateRange) { varfrom= dateRange.From; var to = dateRange.To; return Ok(); }
モデルの準備
次のようなIParsable<T>を実装したDateRangeというクラスを作ります。IParsable<T>はParseとTryParseの実装が必要になり、リクエストパラメータの文字列をアクションの引数にバインドする際にこのParseが呼ばれるようになります。 Parseの中で呼ばれるTryParseでは、"2022/12/31,2023/01/01"のようなカンマ区切りの文字列を分割して、それぞれ文字列からDateOnlyにParseしてToとFromに代入するするものになっています。
publicclassDateRange : IParsable<DateRange> { public DateOnly? From { get; init; } public DateOnly? To { get; init; } publicstatic DateRange Parse(stringvalue, IFormatProvider? provider) { if (!TryParse(value, provider, outvar result)) { thrownew ArgumentException("Could not parse supplied value.", nameof(value)); } return result; } publicstaticbool TryParse(string?value, IFormatProvider? provider, out DateRange dateRange) { var segments =value?.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries); if (segments?.Length ==2&& DateOnly.TryParse(segments[0], provider, outvar fromDate) && DateOnly.TryParse(segments[1], provider, outvar toDate)) { dateRange =new DateRange { From = fromDate, To = toDate }; returntrue; } dateRange =new DateRange { From =default, To =default }; returnfalse; } }
デバッグ実行してみる
エンドポイントのURL(https://localhost:7014/sample/daterange?daterange=2022/12/31,2023/01/01)を叩いてみるとばっちりバインドされていました。
