日付/時間の検証属性を作成してみる

アノテーション検証で、単項目バリデーションを完結させたい場合、アノテーションを作成したくなるケースがあります。
今回は、日付時刻のアノテーション検証と、時間のアノテーション検証を作成してみましょう。

まずは日付時刻のアノテーション検証から作成します。

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受ける用で割り切るのはありなのかなとも思うので、悩むポイントになりそうです。