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