I have the following controller:
[Route("api/[controller]")]
public class ReleaseController : BaseController
{
[HttpPut]
public Task<ReleaseModel> UpdateAsync([FromBody] UpdateReleaseForm form, CancellationToken cancellationToken = default)
=> _releaseService.UpdateAsync(form, cancellationToken);
}
The form
among other properties has enum
property ReleaseStatus
:
public class UpdateReleaseForm
{
// other props omitted for brevity
public ReleaseStatus Status { get; set; }
}
I use FluentValidation
to create a rule for the 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)))));
}
}
The problem is that when a wrong Status
passed in to the action method, I get the error:
{
"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."
}
I want to get my custom message defined in validation rule instead.
I tried to use NullObjectModelValidator
from disable-validation.
Also I tried this:
services.Configure<ApiBehaviorOptions>(options =>
{
options.SuppressModelStateInvalidFilter = true;
});
But get the following:
System.ArgumentNullException: Cannot pass null model to Validate. (Parameter 'instanceToValidate')