ASP.NET Core MVCで郵便番号をチェックするカスタムモデル検証属性を作る

2021年11月23日火曜日

ASP.NET C#

t f B! P L

スポンサーリンク

はじめに

ASP.NET Core MVCには、属性(アノテーションとも呼ぶ)でモデルの検証をする機能がある。

組み込み属性として、必須入力チェックを行う「Required」や、メールアドレスの形式チェックを行う「EmailAddress」などが容易されており、ある程度のチェックはこの組み込み属性で行える。

using System.ComponentModel.DataAnnotations;

public class MyModel
{
    [Required]
    [StringLength(100)]
    public string Title { get; set; }
  
    [EmailAddress]
    public string ContactMailAddress { get; set; }
}

ただし、郵便番号を始めとする個別のデータ形式については当然ながら組み込み属性に存在しない。そのような時は、自作のカスタム検証属性を作ることで、個別のデータ形式についても属性でのモデル検証ができるようになる。

今回は、郵便番号の入力形式をチェックするカスタム属性を作る例を紹介したいと思います。

郵便番号をチェックするカスタム検証属性

カスタム属性の作り方は簡単で、ValidationAttributeを継承したクラスを作り、そこにIsValidメソッドで入力値の検証を行う処理を記述します。

郵便番号の形式が不正な時など、入力エラーがある時は戻り値にValidationResult("エラーメッセージ")を返すと、画面上に指定したメッセージが表示されます。

入力が正常な時はValidationResult.Successを戻り値に返します。

using System.ComponentModel.DataAnnotations;
using System.Text.RegularExpressions;

public class PostalCodeAttribute : ValidationAttribute
{
    private static readonly Regex rx = new Regex("^()$", RegexOptions.Compiled);
  
    public string GetErrorMessage() => $"郵便番号の形式が正しくありません。";

    protected override ValidationResult IsValid(object value,
        ValidationContext validationContext)
    {
        if (value != null && !rx.IsMatch(value.ToString())) {
          return new ValidationResult(GetErrorMessage());
        }

        return ValidationResult.Success;
    }
}

スポンサーリンク

カスタム検証属性を使う

作成したカスタム検証属性の使い方は、組み込み属性と同じで、モデルのプロパティに属性指定します。

using System.ComponentModel.DataAnnotations;

public class MyModel
{
    [PostalCode]
    public string PostalCode { get; set; }
}

もちろん他の検証属性と組み合わせる事も可能で、例えば郵便番号が必須入力であればRequired属性と組み合わせて使用します。

using System.ComponentModel.DataAnnotations;

public class MyModel
{
    [Required]
    [PostalCode]
    public string PostalCode { get; set; }
}

まとめ

ASP.NET Core MVCで、郵便番号をチェックするカスタム属性を作る方法を紹介してきました。

こんな感じで、組み込み属性に足りない入力チェックをカスタム属性として作成していけば、単項目に対する入力チェックのほとんどはモデルに指定した属性だけでチェックすることができるでしょう。

スポンサーリンク
スポンサーリンク

このブログを検索

Profile

自分の写真
Webアプリエンジニア。 日々新しい技術を追い求めてブログでアウトプットしています。
プロフィール画像は、猫村ゆゆこ様に書いてもらいました。

仕事募集もしていたり、していなかったり。

QooQ