ASP.NETで、JSONなどのように複雑な形のリクエストをバリデーションする場合、
一発で検証する方法がなく、苦労していた。
どうにか再帰的にできないかな〜と思っていたところ、
よいライブラリがあったので、紹介します。
https://github.com/tgharold/RecursiveDataAnnotationsValidation
こいつはとても素晴らしいです。(マイクロソフトがちゃんとやってほしい気もするが。。)
(入力定義)
public class Card { [Required] public int? CardId { get; set; } [Required] public string CardName { get; set; } } public class Req { [Required] [Range(0, 10)] public int? UserId { get; set; } [MyValidationCollectionLength(Min = 4, Max = 10)] // 独自のバリデーション public List<Card> CardList { get; set; } } |
(検証コード)
var req = new Req { CardList = new List<Card>() }; req.CardList.Add(new Card()); req.CardList.Add(new Card{CardId = 1, CardName = "hoge"}); req.CardList.Add(new Card{CardId = 2, CardName = ""}); var validator = new RecursiveDataAnnotationValidator(); var validationResults = new List<ValidationResult>(); var result = validator.TryValidateObjectRecursive(req, validationResults); |
(検証結果をJSON化したもの)
[ { "MemberNames": [ "UserId" ], "ErrorMessage": "The UserId field is required." }, { "MemberNames": [ "CardList" ], "ErrorMessage": "The field CardList is invalid." }, { "MemberNames": [ "CardList[0].CardId" ], "ErrorMessage": "The CardId field is required." }, { "MemberNames": [ "CardList[0].CardName" ], "ErrorMessage": "The CardName field is required." }, { "MemberNames": [ "CardList[2].CardName" ], "ErrorMessage": "The CardName field is required." } ] |
という具合に、ちゃんと再帰的に検証してくれます。
APIなんかで複雑なリクエストを検証するときは大いに機能するかと思います。
素晴らしいですね。
以上