Фильтр ошибок состояния модели - PullRequest
0 голосов
/ 24 мая 2018

В моих объектах DTO у меня есть несколько атрибутов, чтобы проверить его действительность

И я улавливаю такой ответ тела, когда проверка не удалась

{
    "TransactionId": [
    "Max length is 20"
    ],
    "AdditionalInfo": [
    "Additional Info has to be no longer than 30 chars"
    ]
}

Но мне нужно объединить все ошибки, чтобыбыть с ключом «Ошибка».Примерно так

{
    "Error": [
    "Max length is 20",
    "Additional Info has to be no longer than 30 chars"
    ]
} 

Я написал специальный фильтр и зарегистрировал его в Startup.cs

public class ModelStateErrorHandlingFilter : IAsyncActionFilter
{
    public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
    {

        if (!context.ModelState.IsValid)
        {
            context.ModelState.SetModelValue("Errors", new ValueProviderResult(new StringValues(context.ModelState.ToString())));
            context.Result = new BadRequestObjectResult(context.ModelState);
        }
        else
        {
            await next().ConfigureAwait(false);
        }
    }
}

Но ничего не меняется.Я также попытался изменить ключ, но у него есть приватный сеттер

1 Ответ

0 голосов
/ 24 мая 2018

Вы должны будете предоставить свой собственный IActionResult или построить желаемую объектную модель и передать ее соответствующему ObjectResult.

public class ModelStateErrorHandlingFilter : IAsyncActionFilter {
    public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) {
        if (!context.ModelState.IsValid) {
            var model = new {
                Error = context.ModelState
                    .SelectMany(keyValuePair => keyValuePair.Value.Errors)
                    .Select(modelError => modelError.ErrorMessage)
                    .ToArray()
            };
            context.Result = new BadRequestObjectResult (model);
        } else {
            await next().ConfigureAwait(false);
        }
    }
}

настройка context.Result приведет к короткому замыканию запроса и передаст ваш пользовательский ответ с желаемым содержимым.

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