参数绑定TypeConverter错误处理

时间:2015-06-24 19:07:13

标签: c# validation typeconverter parameterbinding

这可能是一个非常愚蠢的问题而我错过了一些简单的

我使用Parameter绑定将字符串绑定到一个类型,然后我希望对它进行一些基本的验证。但我似乎无法得到错误消息是有帮助的。

原来我有:

    [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 = 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} /名称/ 784598143uurjkndgkjhajkdhfkladshfkjahsdkfjl

但是验证不起作用,当我尝试抛出异常时,错误消息是通用的。

我选择这样做的原因是我希望名称是URI参数,但我也希望对其进行验证并使错误消息有意义。

有没有更简单的方法可以做到这一点,或者我错过了一些简单的东西?

0 个答案:

没有答案