日付/時間の検証属性を作成してみる
アノテーション検証で、単項目バリデーションを完結させたい場合、アノテーションを作成したくなるケースがあります。
今回は、日付時刻のアノテーション検証と、時間のアノテーション検証を作成してみましょう。
まずは日付時刻のアノテーション検証から作成します。
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.ComponentModel.DataAnnotations; namespace CreatioVitae.Core.Attributes { public class IsDateTimeAttribute : ValidationAttribute { public IsDateTimeAttribute() { } public override bool IsValid(object value) { if (value == null) { return true; } var dummy = new DateTime(); return (DateTime.TryParse(value.ToString(), out dummy)); } } }
IsValidメソッドのオーバーライドを用意して、日付の判定処理を行います。
次に、時間のアノテーション検証を作成します。
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.ComponentModel.DataAnnotations; namespace CreatioVitae.Core.Attributes { public class IsTimeAttribute : ValidationAttribute { public IsTimeAttribute() { } public override bool IsValid(object value) { if (value == null) { return true; } return (System.Text.RegularExpressions.Regex.IsMatch(value.ToString(), @"^([0-1][0-9]|[2][0-3]):[0-5][0-9]$")); } } }
利用方法はいつもの通りです。
[IsDateTime(ErrorMessage = "{0}は日付の形式で入力してください。")] public string hoge_datetime{get;set;}
Json等から、モデルバインドする場合、日付時刻型が、Jsonには存在しないため、上記のようなアノテーション検証が欲しくなったりします。
ところで、C#だと、プロパティはパスカルケースで命名したいけど、Jsonはスネークケースなので、Jsonを受けるモデルについては、スネークで書いたら、キモいなーというのが最近の悩みです。
実害としては、JsonModelからDomainModelなり、ViewModelなりに変換するときに、AutoMapperなりでマップするんですが、CreateMapするときに、いちいちマップのルールを書かなきゃいけないのが、面倒だなーというのがあります。
ただ結局、Json返すときにマップなり、オブジェクト名変換する処理書くなら、JsonModelの中だけはJson受ける用で割り切るのはありなのかなとも思うので、悩むポイントになりそうです。