可能这是一个非常愚蠢的问题,我错过了一些简单的东西
我正在使用参数绑定将字符串绑定到类型,然后我希望对其进行一些基本验证。但我似乎无法让错误消息有所帮助。
最初我有:
[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 参数,但我也想对其进行验证并使错误消息有意义。
有没有更简单的方法可以做到这一点,或者我错过了一些简单的东西?