Ktouth Brand. on Web

け〜くんこと K.Ktouth のだらだらした日常と突発的に作るプログラムや読み物とかの雑多サイト



[2014年08月11日]

Catel の検証機能と DataAnnotation を連携させると……?

2014年08月13日 07:29更新 筆者:K.Ktouth

モデルデータの検証コードを DataAnnotation で実装してみたところ、なんだか妙な挙動を始めたのでソースをちょっと手繰ってみたのですが……何処が悪いのかよく分からず。独自に検証属性クラスを作っていたのが(実装が)悪いのか、Catel側での操作が悪いのか。……デバッグ時の情報を見る限り、変更したプロパティと別のプロパティの情報が渡ってきている気がするんだけどなぁ……??

やっぱ拡張機能も存在する FluentValidation ライブラリと組み合わせろって事なのかも。
とはいえこの前のシリアライズ機能の中途半端なイメージもあるし、結局、Catel が準備している検証用仮想メソッドに独自のヘルパーメソッド経由で検証コードを書くことに決定。

protected override void ValidateFields(List<IFieldValidationResult> validationResults)
{
  base.ValidateFields(validationResults);
  validationResults
    .TryValidate(NameProperty, Name)
      .Required()
      .FileName()
      .UniqueWithoutMyself(ProfileContainer ?? Enumerable.Empty<SyncProfile>(), this, x => x.Name).WithMessage("プロファイル一覧に既に登録されている名前です")
    .TryValidate(BaseDirectoryInPlayListProperty, BaseDirectoryInPlayList)
      .Required()
      .UnixDirectoryName(true)
    .TryValidate(PlaylistsProperty, Playlists)
      .NotEmpty().WithMessage("プレイリストが一つも登録されていません")
      .ModelValidate().WithMessage("プレイリストに一つ以上のエラーもしくは警告が含まれています")
    .Sucess();
}

実際のヘルパーメソッド群は省きますが、これくらいならシンプルにいけるので良いかな、と。
これ以上複雑な条件が必要なら、それこそ直に書けば良いのでそこまで問題になりません。

本日のリンク元
その他のリンク元
検索