Возврат к исходному виду из фильтра действий MVC - PullRequest
2 голосов
/ 19 июня 2019

Я работаю над основным сайтом asp.net и пытаюсь сделать какую-то глобальную проверку исключений проверки с помощью фильтров.Бэкэнд может в случайных местах генерировать fluentapi ValidationException, и я хочу перехватить их и показать пользователю сообщения об ошибках.Этот фильтр заботится только о ValidationExceptions.Все остальные исключения будут обработаны позже ..

Вместо использования try / catch в каждом действии post во всех моих контроллерах, я хочу использовать фильтр, который перехватывает только ValidationExceptions, добавляет ошибки в ModelState, а затемвернитесь к исходному виду с обновленным ModelState.

Я много чего перепробовал, но каждый раз, когда фильтр заканчивал, я просто получал пустую страницу.Я могу легко установить новый RedirectToRouteResult с контроллером и действием из контекста.Но тогда у меня нет ModelState и значений, введенных пользователем.

public class PostExceptionFilter : ExceptionFilterAttribute
{
    public override void OnException(ExceptionContext context)
    {
        if (context.Exception is FluentValidation.ValidationException)
        {
            var ex = context.Exception as FluentValidation.ValidationException;
            context.Exception = null;
            context.HttpContext.Response.StatusCode = 200;
            context.ExceptionHandled = true;
            foreach (var item in ex.Errors.ToList())
            {
                context.ModelState.AddModelError(item.PropertyName, item.ErrorMessage);
            }

            // Done with the stuff I want.
            // Now please go back to the original view with the updated modelstate and values
        }
        else if (context.Exception is UnauthorizedAccessException)
        {
            // Do something else...
        }
        else
        {
            // Do something else...
        }
        base.OnException(context);
    }
}

1 Ответ

0 голосов
/ 19 июня 2019

Вы не можете получить доступ к элементу Model (связанному с методом действия) в Exception Filters. Таким образом, вы должны обработать ошибку на уровне Controller, если хотите добавить Errors к модели.

try
{
    //Do something
}
Catch(Exception e)
{
    ModelState.AddModelError(string key, string errorMessage);
    Return View(model)
}

Сообщение об ошибке появится в <%: Html.ValidationSummary() %> в вашем View

Без блоков try-catch вы не узнаете, произошло ли exception в методе действия, так что вы можете добавить пользовательские ошибки в модель.

...