Как установить ExceptionHandled в ActionExecutedContext

Я использую ActionFilter (который я не писал) в методе действия. Сам метод действия вызывает метод SaveOrUpdate() в репозитории. Если этот метод SaveOrUpdate() не работает с исключением, я хотел бы установить свойство ExceptionHandled ActionExecutedContext из метода действия, чтобы метод OnActionExecuted не пытался зафиксировать транзакцию.

Как я могу это сделать? Это правильный подход к этому или я должен делать это по-другому?

Вот код в OnActionExecuted фильтра:

public  void OnActionExecuted(ActionExecutedContext filterContext)
    {
        var thereWereNoExceptions = filterContext.Exception == null || filterContext.ExceptionHandled;
        if (filterContext.Controller.ViewData.ModelState.IsValid && thereWereNoExceptions)
        {
            _transaction.Commit();
        }
        else
        {
            _transaction.Rollback();
        }
    }

person Simon Lomax    schedule 18.01.2011    source источник


Ответы (2)


Вам не нужно этого делать. Просто сгенерируйте исключение:

[MyFilter]
public ActionResult Index()
{
    throw new Exception("foo");
}

и оператор else вашего фильтра OnActionExecuted сработает и отменит транзакцию.

person Darin Dimitrov    schedule 18.01.2011
comment
Хм, исключение, выдаваемое из метода действия, — это то, как я обнаружил проблему в первую очередь. В конце концов я решил поймать исключение и добавить ошибку ModelState. Затем срабатывает оператор else, поскольку он проверяет, соответствует ли ModelState.IsValid. - person Simon Lomax; 18.01.2011
comment
@ Саймон, это странно. Я не могу воспроизвести поведение. Я написал собственный атрибут фильтра действий, полученный из ActionFilterAttribute, и переопределил OnActionExecuted, поместив точно такой же тест, как и в вашем случае. Затем я украсил свое действие контроллера этим пользовательским атрибутом, и когда в действии контроллера возникло исключение, выполняется оператор else. Чем ваш сценарий отличается от моего? Ваш атрибут действия происходит от ActionFilterAttribute или вы просто реализуете интерфейс IActionFilter? - person Darin Dimitrov; 18.01.2011

Вот код, который я использую для обработки пользовательских ошибок.

filterContext.ExceptionHandled = true;
filterContext.HttpContext.Response.Clear();
filterContext.HttpContext.Response.StatusCode = 500;
filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
person Community    schedule 24.05.2013