これは非常にばかげた質問である可能性があり、単純なものが欠けています
パラメータバインディングを使用して文字列を型にバインドしていますが、基本的な検証を行うことを望んでいました。しかし、エラーメッセージが役に立たないようです。
もともと私は持っていました:
[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 パラメーターにしたいのですが、それに対して検証を行い、エラー メッセージを意味のあるものにしたいからです。
これを行うためのより簡単な方法はありますか、それとも簡単なものがありませんか?