问题描述
我有以下控制器:
[Route("api/[controller]")]
public class ReleaseController : BaseController
{
[HttpPut]
public Task<ReleaseModel> UpdateAsync([FromBody] UpdateReleaseForm form,CancellationToken cancellationToken = default)
=> _releaseService.UpdateAsync(form,cancellationToken);
}
form
和其他属性具有enum
属性ReleaseStatus
:
public class UpdateReleaseForm
{
// other props omitted for brevity
public ReleaseStatus Status { get; set; }
}
我使用FluentValidation
为Status
创建规则:
internal sealed class UpdateReleaseFormValidator : AbstractValidator<UpdateReleaseForm>
{
public UpdateReleaseFormValidator()
{
// other rules omitted for brevity
RuleFor(u => u.Status)
.ReleaseStatusValidation();
}
}
public static class RuleBuildersExtensions
{
public static IRuleBuilderOptions<T,ReleaseStatus> ReleaseStatusValidation<T>(
this IRuleBuilder<T,ReleaseStatus> rule)
{
return rule.
IsInEnum()
.WithMessage(
string.Format("Status should be one of the following values: `{0}`",string.Join(",",Enum.GetNames(typeof(ReleaseStatus)))));
}
}
问题是,当错误的Status
传递给action方法时,我得到了错误:
{
"errors": {
"status": [
"Error converting value \"WrongStatus\" to type '...ReleaseStatus'. Path 'Status',line 4,position 28."
]
},"type": "https://tools.ietf.org/html/rfc7231#section-6.5.1","title": "One or more validation errors occurred.","status": 400,"traceId": "|3405bc61-4f67bebc131b8dc8."
}
我想改为在验证规则中定义我的自定义消息。
我尝试使用disable-validation中的NullObjectModelValidator
。
我也尝试过:
services.Configure<ApiBehaviorOptions>(options =>
{
options.SuppressModelStateInvalidFilter = true;
});
但是请获取以下内容:
System.ArgumentNullException:无法将空模型传递给Validate。 (参数“ instanceToValidate”)
解决方法
只是一个想法,但是您可以尝试在UpdateAsync方法nullable中创建UpdateReleaseForm表单参数:
[Route("api/[controller]")]
public class ReleaseController : BaseController
{
[HttpPut]
public Task<ReleaseModel> UpdateAsync([FromBody] UpdateReleaseForm? form,CancellationToken cancellationToken = default)
=> _releaseService.UpdateAsync(form,cancellationToken);
}
也许允许该参数为空。