Глобальная валидация ModelState в Asp.Net Core Mvc - PullRequest
1 голос
/ 12 марта 2019

Как я могу создать настраиваемый фильтр действий, который будет проверять, является ли ModelState действительным, а если нет, возвращает ошибки ModelState в то же представление? Я хочу написать пользовательский фильтр действий, который перед всеми запросами POST должен убедиться, что ModelState действителен, а если ModelState недействителен, он вернет ошибки ModelState в то же представление.

Это мой пример кода. Но я действительно не знаю, как вернуть ошибки ModelState в то же представление.

namespace Site.Web.Infrastructures.CustomValidationAttribute
{
    public class GlobalMvcValidateModelStateAttribute : ActionFilterAttribute
    {
        public override Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
        {
            if (!context.ModelState.IsValid)
            {
                List<string> list = (from modelState in context.ModelState.Values from error in modelState.Errors select error.ErrorMessage).ToList();

                //Also add exceptions.
                list.AddRange(from modelState in context.ModelState.Values from error in modelState.Errors select error.Exception.ToString());

                context.Result = new BadRequestObjectResult(list);
            }

            return base.OnActionExecutionAsync(context, next);
        }
    }
}

1 Ответ

2 голосов
/ 13 марта 2019

Вот что вам нужно, чтобы добавить глобальную проверку ModelState для Views:

public class GlobalModelStateValidatorAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext context)
    {
        if (!context.ModelState.IsValid)
        {
            Controller controller = context.Controller as Controller;
            object model = context.ActionArguments.Any()
               ? context.ActionArguments.First().Value
               : null;

            context.Result = (IActionResult)controller?.View(model)
               ?? new BadRequestResult();
        }

        base.OnActionExecuting(context);
    }
}

Затем вам нужно зарегистрировать этот фильтр в вашем приложении:

services.AddMvc(opt =>
{
    opt.Filters.Add(typeof(GlobalModelStateValidatorAttribute));
});

И вот пример кода:https://github.com/MoienTajik/AspNetCoreGlobalModelStateValidator

...