Home –  未分類 – ASP.NET Core で複雑なバリデーションをする

ASP.NET Core で複雑なバリデーションをする

本日もメモがてら・・・

ASP.NET Coreのバリデーションはモデルにアノテーションを入れるだけでサックサクに出来るので楽させてもらっています。
最大文字数制御や正規表現による入力規制とかは大丈夫なのですが、色々な要素が絡みあった入力チェックをしたいときがあります。

別テーブルのデータを見てとある入力がある場合は入力を特定の値に制限するなど、別テーブルまで絡んだりすると標準のバリデーションでは出来ないのではないかと思います。

ASP.NET CoreではIValidatableObjectを実装したクラスに対してValidation時にValidateのメソッドを呼び出してくれます。
そこでモデル全体としての入力チェックが出来るので、そこで行うと良いみたいです。

この時にDbContext(ApplicationDbContext)が使いたくなることもあると思います。その場合はvalidationContext.GetServiceで取得することが可能です。
データベースに以外にもサービスが定義されていれば必要に応じて取得できそうです。

using System.ComponentModel.DataAnnotations;

public class HogeHoge : IValidatableObject
{

    // 〜〜〜 色々省略 〜〜

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        //DbContext取得
        var dbContext = (ApplicationDbContext)validationContext.GetService(typeof(ApplicationDbContext));


        if(true){ //本当は入力チェック(;・∀・)
            yield return new ValidationResult("エラーメッセージ");
        }

    }
}

コメントを残す