1

これは非常にばかげた質問である可能性があり、単純なものが欠けています

パラメータバインディングを使用して文字列を型にバインドしていますが、基本的な検証を行うことを望んでいました。しかし、エラーメッセージが役に立たないようです。

もともと私は持っていました:

    [HttpPost]
    [Route("user/{id:guid}/name/{name}")]
    public async Task<IHttpActionResult> PostUserName(Guid id, [FromUri] Request Name)
    {
        ....
    }

public class Request
{
    [Required]
    [StringLength(17, MinimumLength = 17, ErrorMessage = ValidationConstants.LengthMessage)]
    [RegularExpression(ValidationConstants.AlphaNumericRegex, ErrorMessage = ValidationConstants.AlphaNumericMessage)]
    public string Name { get; set; }
}

エラーメッセージは素晴らしく見えましたが、リクエストURIは次のようになりました:

http://localhost:2010/v2/users/ {id}/name/{Name}?name.Name=784598143uurjkndgkjhajkdhfkladshfkjahsdkfjl

それから私は試しました

    [HttpPost]
    [Route("user/{id:guid}/name/{name}")]
    public async Task<IHttpActionResult> PostUserName(Guid id, Request name)
    {
        .....
    }


    [TypeConverter(typeof(RequestConverter))]
    public class Request
    {
        [Required]
        [StringLength(50, MinimumLength = 1, ErrorMessage = ValidationConstants.LengthMessage)]
        [RegularExpression(ValidationConstants.AlphaNumericRegex, ErrorMessage = ValidationConstants.AlphaNumericMessage)]

        public string Name { get; set; } 

        public static bool TryParse(string s, out Request result)
        {
            result = new Request() { Name = s };
           if (result.Name != null)
           {
                return false;
            }

            return true;
        }
    }

    class RequestConverter : TypeConverter
    {
        public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
        {
            if (sourceType == typeof(string))
            {
                return true;
            }
            return base.CanConvertFrom(context, sourceType);
        }

        public override object ConvertFrom(ITypeDescriptorContext context,
            CultureInfo culture, object value)
        {
            if (value is string)
            {
                Request t;
                try
                {
                    if (Request.TryParse((string)value, out t))
                    {
                        return t;
                    }
                }
                catch (Exception e)
                {
                    throw e; 
                }
            }
            return base.ConvertFrom(context, culture, value);
        }
    }
}

このため、URI は適切に見えます。

http://localhost:2010/v2/users/ {id}/name/784598143uurjkndgkjhajkdhfkladshfkjahsdkfjl

しかし、検証は機能せず、例外をスローしようとすると、エラー メッセージは一般的です。

この方法を選択した理由は、名前を URI パラメーターにしたいのですが、それに対して検証を行い、エラー メッセージを意味のあるものにしたいからです。

これを行うためのより簡単な方法はありますか、それとも簡単なものがありませんか?

4

0 に答える 0