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>();

Я не уверен, что мне не хватает в руководстве?

0 ответов

Другие вопросы по тегам