C#
 Computer >> コンピューター >  >> プログラミング >> C#

C#のFluentValidationでDateOfBirth(生年月日)を検証する方法|未来日付をエラーにするカスタムルールの実装

C#でモデルクラスのプロパティに対して検証ルールを定義するなら、定番ライブラリFluentValidationが便利です。本記事では、「生年月日(DateOfBirth)が今年より未来の日付であればエラーにする」というよくある要件を、RuleForメソッドとMust句を使って実装する手順を解説します。

RuleForメソッドで検証ルールを定義する

特定のプロパティに対して検証ルールを指定するには、RuleForメソッドを呼び出し、検証したいプロパティを示すラムダ式を渡します。

RuleFor(p => p.DateOfBirth)

上記の例では、PersonModelクラスのDateOfBirthプロパティに対するルールを定義しています。

Validateメソッドでバリデーションを実行する

検証を実行するには、バリデーターオブジェクトをインスタンス化し、Validateメソッドに検証対象のオブジェクトを渡して呼び出します。

ValidationResult results = validator.Validate(person);

ValidateメソッドはValidationResultオブジェクトを返します。このオブジェクトには、次の2つの重要なプロパティが含まれています。

  • IsValid … 検証が成功したかどうかを表すbool値
  • Errors … 検証失敗の詳細を格納したValidationFailureオブジェクトのコレクション

実装例:未来の生年月日を検出する

次のサンプルコードでは、生年月日に「現在の日付から1年後」(つまり未来の日付)を設定し、カスタム判定メソッドBeAValidAgeによって検証エラーを発生させています。

using System;
using System.Collections.Generic;
using FluentValidation;
using FluentValidation.Results;

class Program
{
    static void Main(string[] args)
    {
        List<string> errors = new List<string>();

        PersonModel person = new PersonModel();
        person.FirstName = "TestUser";
        person.LastName = "TestUser";
        person.AccountBalance = 100;
        person.DateOfBirth = DateTime.Now.Date.AddYears(1); // 意図的に未来の日付を設定

        PersonValidator validator = new PersonValidator();

        ValidationResult results = validator.Validate(person);

        if (results.IsValid == false)
        {
            foreach (ValidationFailure failure in results.Errors)
            {
                errors.Add(failure.ErrorMessage);
            }
        }

        foreach (var item in errors)
        {
            Console.WriteLine(item);
        }
        Console.ReadLine();
    }
}

public class PersonModel
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public decimal AccountBalance { get; set; }
    public DateTime DateOfBirth { get; set; }
}

public class PersonValidator : AbstractValidator<PersonModel>
{
    public PersonValidator()
    {
        RuleFor(p => p.DateOfBirth)
            .Must(BeAValidAge).WithMessage("Invalid {PropertyName}");
    }

    // 生年月日が妥当な範囲内かどうかを判定するカスタムメソッド
    protected bool BeAValidAge(DateTime date)
    {
        int currentYear = DateTime.Now.Year;
        int dobYear = date.Year;

        // 生年が現在年以下 かつ 120年前より後 であれば有効とみなす
        if (dobYear <= currentYear && dobYear > (currentYear - 120))
        {
            return true;
        }

        return false;
    }
}

ポイント:BeAValidAgeメソッドの判定ロジック

  • DateTime.Now.Yearで現在の西暦を取得します。
  • 生年が「現在年以下」かつ「現在年−120より大きい」場合のみtrue(有効)を返します。
  • そのため、来年などの未来の日付や120年以上前の日付はfalseとなり、検証エラーになります。

実行結果

Invalid Date Of Birth

DateOfBirthに未来の日付が設定されていたため、WithMessageで指定したエラーメッセージ({PropertyName}には自動的にプロパティ名が挿入されます)が出力されました。

まとめ

FluentValidationでは、Must句に独自の判定メソッドを渡すことで、ビルトインルールだけでは表現できない複雑な条件(年齢の妥当性チェックなど)も柔軟に実装できます。生年月日だけでなく、入社日や契約日など「過去から現在の範囲内であるべき日付」全般に応用できるパターンなので、ぜひ活用してみてください。

  1. JavaScriptで基本的なフォームバリデーションを実装する方法|サンプルコード付き解説

    JavaScriptを使えば、フォームのデータをWebサーバーへ送信する前に、ユーザーのブラウザー上(クライアント側)で検証することができます。 基本的なフォーム検証では、必須項目がすべて正しく入力されているかを確認します。処理の流れとしては、フォーム内の各フィールドを順番に調べ、データが入力されているかをチェックするだけです。 実装例:基本的なフォーム検証 以下のコードを実行すると、JavaScriptによる基本的なフォーム検証の動作を実際に確認できます。 <html> <head> <title>フォーム検証</title>

  2. 【Android開発】Year APIクラスを使って現在の年を取得・表示する方法

    はじめにこのチュートリアルでは、java.timeパッケージに含まれるYear APIクラスを使って、Androidアプリで現在の年を取得し画面に表示する方法を解説します。Calendarクラスなどを直接操作するよりも直感的に年情報を扱えるため、日付処理を行うアプリの開発に役立ちます。ステップ1:新規プロジェクトを作成するAndroid Studioを開き、File ⇒ New Project を選択します。必要な項目をすべて入力して、新しいプロジェクトを作成しましょう。ステップ2:レイアウトファイル(activity_main.xml)を編集するres/layout/activit