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句に独自の判定メソッドを渡すことで、ビルトインルールだけでは表現できない複雑な条件(年齢の妥当性チェックなど)も柔軟に実装できます。生年月日だけでなく、入社日や契約日など「過去から現在の範囲内であるべき日付」全般に応用できるパターンなので、ぜひ活用してみてください。
-
JavaScriptで基本的なフォームバリデーションを実装する方法|サンプルコード付き解説
JavaScriptを使えば、フォームのデータをWebサーバーへ送信する前に、ユーザーのブラウザー上(クライアント側)で検証することができます。 基本的なフォーム検証では、必須項目がすべて正しく入力されているかを確認します。処理の流れとしては、フォーム内の各フィールドを順番に調べ、データが入力されているかをチェックするだけです。 実装例:基本的なフォーム検証 以下のコードを実行すると、JavaScriptによる基本的なフォーム検証の動作を実際に確認できます。 <html> <head> <title>フォーム検証</title>
-
【Android開発】Year APIクラスを使って現在の年を取得・表示する方法
はじめにこのチュートリアルでは、java.timeパッケージに含まれるYear APIクラスを使って、Androidアプリで現在の年を取得し画面に表示する方法を解説します。Calendarクラスなどを直接操作するよりも直感的に年情報を扱えるため、日付処理を行うアプリの開発に役立ちます。ステップ1:新規プロジェクトを作成するAndroid Studioを開き、File ⇒ New Project を選択します。必要な項目をすべて入力して、新しいプロジェクトを作成しましょう。ステップ2:レイアウトファイル(activity_main.xml)を編集するres/layout/activit