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参数,但我也希望对其进行验证,并使错误消息有意义
有没有更简单的方法来做这件事,或者我遗漏了一些简单的东西