ASP.NET Core 2.1 Как зарегистрировать атрибут настраиваемого действия в Сервисах - PullRequest
0 голосов
/ 06 октября 2018

Я следую этому руководству 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>();

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...