松山事務所の横山です。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)
            });
        }
    }
}
TOP
TOP