備忘録

備忘録

ASP.NET でバリデーションする方法

Ⅰ. はじめに

タイトルの通り「ASP.NET 7でバリデーションする方法」です。

※2024/01/25 追記
.NET 8はこちらが利用できます

Ⅱ. 手順

1. 必要なパッケージをインストールする
dotnet add package FluentValidation
dotnet add package FluentValidation.DependencyInjectionExtensions

# Minimal API
dotnet add package SharpGrip.FluentValidation.AutoValidation.Endpoints

# MVC
# dotnet add package SharpGrip.FluentValidation.AutoValidation.Mvc
2. サンプルプログラムを書く

Program.cs

using FluentValidation;
using SharpGrip.FluentValidation.AutoValidation.Endpoints.Extensions;

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddFluentValidationAutoValidation(options =>
{
  // [FromForm] に対してもバリデーションする場合はtrueを指定する
  // options.EnableFormBindingSourceAutomaticValidation = true;
});
builder.Services.AddValidatorsFromAssemblyContaining<HelloRequest>(ServiceLifetime.Singleton);

var app = builder.Build();
var endpointGroup = app.MapGroup("").AddFluentValidationAutoValidation();

endpointGroup.MapPost("/test001", (HelloRequest request) =>
{
  return $"Hello {request.LastName} {request.FirstName}";
});

app.Run();

public class HelloRequest
{
  public required string FirstName { get; set; }
  public required string LastName { get; set; }

  public class Validator : AbstractValidator<HelloRequest>
  {
    public Validator()
    {
      RuleFor(x => x.FirstName)
        .NotEmpty();
        // .WithMessage("FirstNameは空に出来ません");

      RuleFor(x => x.LastName)
        .NotEmpty();
        // .WithMessage("LastNameは空に出来ません");
    }
  }
}

実行結果

成功例
POST http://localhost:5178/test001 HTTP/1.1
Host: localhost:5178
Content-Type: application/json

{
  "firstName": "tarou",
  "lastName": "tanaka"
}


HTTP/1.1 200 OK
Hello tanaka tarou
失敗例
POST http://localhost:5178/test001 HTTP/1.1
Host: localhost:5178
Content-Type: application/json

{
  "firstName": "",
  "lastName": "tanaka"
}


HTTP/1.1 400 Bad Request
Content-Type: application/problem+json

{
  "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
  "title": "One or more validation errors occurred.",
  "status": 400,
  "errors": {
    "FirstName": [
      "'First Name' は空であってはなりません。"
    ]
  }
}