ASP.NET Core 2.1 Как зарегистрировать атрибут настраиваемого действия в Сервисах
Я следую этому руководству https://www.jerriepelser.com/blog/validation-response-aspnet-core-webapi/ чтобы получить проверки состояния модели для моего веб-интерфейса. Однако даже после того, как я зарегистрировал свой новый фильтр в области услуг, он не показывает правильную ошибку. Это должен быть запрос ошибки 422 со структурой:
{
"message": "Validation Failed",
"errors": [
{
"field": "Secret Key",
"message": "'Secret Key' should not be empty."
}
]
}
Но я получаю только 400 плохих запросов с этой структурой:
{"SecretKey":["The SecretKey field is required."]}
Вот как я это реализовал:
Атрибут фильтра действий
public class ModelValidationAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext context)
{
if (!context.ModelState.IsValid)
{
context.Result = new ValidationFailedResult(context.ModelState);
}
}
}
Результат проверки не пройден
public class ValidationFailedResult : ObjectResult
{
public ValidationFailedResult(ModelStateDictionary modelState)
: base(new ValidationResultViewModel(modelState))
{
StatusCode = StatusCodes.Status422UnprocessableEntity;
}
}
ViewModels
public class ValidationErrorViewModel
{
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public string Field { get; }
public string Message { get; }
public ValidationErrorViewModel(string field, string message)
{
Field = field != string.Empty ? field : null;
Message = message;
}
}
public class ValidationResultViewModel
{
public string Message { get; }
public List<ValidationErrorViewModel> Errors { get; }
public ValidationResultViewModel(ModelStateDictionary modelState)
{
Message = "Validation Failed";
Errors = modelState.Keys
.SelectMany(key => modelState[key].Errors.Select(x => new ValidationErrorViewModel(key, x.ErrorMessage)))
.ToList();
}
}
Я реализовал это на контроллере так:
[ServiceFilter(typeof(ModelValidationAttribute))]
Вот как я реализовал это на моем Startup.cs
services.AddScoped<ModelValidationAttribute>();
Я не уверен, что мне не хватает в руководстве?