C# 参数绑定TypeConverter错误处理

C# 参数绑定TypeConverter错误处理,c#,validation,typeconverter,parameterbinding,C#,Validation,Typeconverter,Parameterbinding,这可能是一个非常愚蠢的问题,我遗漏了一些简单的东西 我正在使用参数绑定将字符串绑定到类型,然后希望对其进行一些基本验证。但我似乎无法让错误消息发挥作用 最初我有: [HttpPost] [Route("user/{id:guid}/name/{name}")] public async Task<IHttpActionResult> PostUserName(Guid id, [FromUri] Request Name) { ....

这可能是一个非常愚蠢的问题,我遗漏了一些简单的东西

我正在使用参数绑定将字符串绑定到类型,然后希望对其进行一些基本验证。但我似乎无法让错误消息发挥作用

最初我有:

    [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; }
}
[HttpPost]
[路由(“用户/{id:guid}/name/{name}”)]
公共异步任务姿势名称(Guid id,[FromUri]请求名称)
{
....
}
公共类请求
{
[必需]
[StringLength(17,MinimumLength=17,ErrorMessage=ValidationConstants.LengthMessage)]
[正则表达式(ValidationConstants.AlphaNumericRegex,ErrorMessage=ValidationConstants.AlphaNumericMessage)]
公共字符串名称{get;set;}
}
错误消息看起来很棒,但我的请求URI如下所示:

{id}/name/{name}?name.name=784598143uurjkndgkjhajkdhfkladshfkjahsdkjl

然后我试着

    [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);
        }
    }
}
[HttpPost]
[路由(“用户/{id:guid}/name/{name}”)]
公共异步任务posterName(Guid id、请求名称)
{
.....
}
[TypeConverter(typeof(RequestConverter))]
公共类请求
{
[必需]
[StringLength(50,MinimumLength=1,ErrorMessage=ValidationConstants.LengthMessage)]
[正则表达式(ValidationConstants.AlphaNumericRegex,ErrorMessage=ValidationConstants.AlphaNumericMessage)]
公共字符串名称{get;set;}
公共静态bool TryParse(字符串s,out请求结果)
{
结果=新请求(){Name=s};
if(result.Name!=null)
{
返回false;
}
返回true;
}
}
类RequestConverter:TypeConverter
{
公共覆盖布尔CanConvertFrom(ITypeScriptorContext上下文,类型sourceType)
{
if(sourceType==typeof(string))
{
返回true;
}
返回base.CanConvertFrom(上下文,sourceType);
}
公共重写对象转换自(ITypeDescriptorContext上下文,
文化信息(文化,对象值)
{
if(值为字符串)
{
请求t;
尝试
{
if(Request.TryParse((字符串)值,out t))
{
返回t;
}
}
捕获(例外e)
{
投掷e;
}
}
返回base.ConvertFrom(上下文、区域性、值);
}
}
}
为此,URI看起来不错:

{id}/name/784598143UURJKNDGKJHAJKDHFKLADSHFKJAHSDKJL

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

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

有没有更简单的方法来做这件事,或者我遗漏了一些简单的东西