松山事務所の横山です。ASP.NET(C#)のWebAPIにて
jsonのリクエストに対して、配列内の各要素のデータ検証がしたかったのでその際の対応をメモ
jsonから以下のリクエスを受け取る際に、Valuesの各配列に対して最大文字数チェックをしたい。
{ "name":"hoge", "values":["xxxx1","xxxx2","xxxx3"] }
文字列の最大文字数チェックは以下の2つの属性が既存で提供されている。
System.ComponentModel.DataAnnotations
– StringLength(max)・・・文字列の最大文字数を検証
– MaxLength(max)・・・文字列の最大文字数、配列の最大要素数を検証
どちらも、配列内の各要素に対しての検証は行わないようなのでStringLengthAttributeを継承した検証クラスを自作した。
using System.ComponentModel.DataAnnotations; using System.Collections; namespace WebAPI.Binding { public class BindStringLengthAttribute:StringLengthAttribute { public BindStringLengthAttribute(int maximumLength) :base(maximumLength) { } public override bool IsValid(object value) { //配列の場合も対応 if (value is ICollection list) { foreach (object obj in list) { if (!base.IsValid(obj)) { return false; } } return true; } else { return base.IsValid(value); } } } }
コントローラー側はこんな感じ
List“にしているが、string[]でもOK。
using WebAPI.Binding namespace WebAPI.Controllers { public class TestController : ApiController { public class PostRequest { [Required] public string name { get; set; } [Required, BindStringLength(5)] public List values { get; set; } } public HttpResponseMessage Post(PostRequest req) { if(!ModelState.IsValid) { return Request.CreateResponse(HttpStatusCode.BadRequest); } return Request.CreateResponse(HttpStatusCode.OK, new { name = req.name, values = req.values.Select(a => a) }); } } }