У меня есть IActionFilter, который что-то делает в OnActionExecuted, однако я не хочу выполнять это действие, когда результат контроллера выполняет перенаправление.

Моя первоначальная мысль состояла в том, чтобы проверить тип ActionResult как RedirectResult или RedirectToRouteResult, но это ненадежно, так как любой тип результата может выполнять перенаправление (действительно, у меня есть два пользовательских те, которые делают).

Есть ли другой способ определить, когда это произойдет, или это невозможно, поскольку вы не будете знать о перенаправлении до тех пор, пока действие не будет выполнено (что слишком поздно, чтобы делать то, что я хочу)?

Возможно, просто проверка ViewResult и PartialViewResult будет более надежной.

4
roryf 5 Ноя 2009 в 18:05
Проверка ViewResult не будет работать, потому что может быть JsonResult, результат JavaScript и любой CustomResult.
 – 
queen3
5 Ноя 2009 в 22:08
В этом случае я могу спокойно игнорировать эти типы, меня интересует только то, когда визуализируется представление (что я только что понял, так что это несколько делает мой вопрос немым...)
 – 
roryf
6 Ноя 2009 в 13:31

2 ответа

Я бы предложил просто проверить тип результата. Вы можете пометить свои пользовательские действия с помощью «[IsRedirect]», назвать их «... Redirect» или получить от «IRedirectResult» для обнаружения.

Альтернативные решения, которые приходят мне в голову:

  1. Вместо этого обработайте OnResultExecuted и проверьте, что Result сделал с контекстом HTTP (URL-адрес изменился и т. д.) — не уверен, что это работает.
  2. Вручную вызовите Result.Execute() с поддельным контекстом и проверьте, что результат сделал с этим поддельным контекстом. Вы можете запомнить свой фальшивый контекст, вызывался ли какой-либо «Перенаправление».

Но просто проверить тип результата намного проще.

0
queen3 5 Ноя 2009 в 19:09
1
Мое решение на данный момент состоит в том, чтобы проверить, имеет ли результат тип ViewResultBase, который охватывает ViewResult и PartialViewResult. Я пока не могу придумать какой-либо другой результат, который я мог бы осветить, кроме того, что я бы добавил сам.
 – 
roryf
5 Ноя 2009 в 20:17

... это ненадежно, так как любой тип результата может выполнить перенаправление (действительно, у меня есть два пользовательских, которые делают)

Если они выполняют перенаправление, это необходимо сделать, задав для Result значение RedirectResult или аналогичное, а не только Response.Redirect.
Если это Response.Redirect, то это явно неправильно.
Примером является AuthorizeAttribute, который изменяет результат на HttpUnauthorizedResult.

Таким образом, вы все равно получите ControllerContext.Result и сможете работать с ним.


Кроме того, как насчет применения соглашения: если имя типа ActionResult содержит слово «Redirect», значит, это перенаправление.

var isRedirect = filterContext.ActionResult.GetType().Name.Contains("Redirect");

Если он выглядит как утка, плавает как утка и крякает как утка, то, вероятно, это утка.

Решение конечно не идеальное, но простое и понятное.

3
Dmytrii Nagirniak 6 Ноя 2009 в 02:28
AuthorizeAttribute выполняется до вызова контроллера, у меня есть настраиваемые ActionResults, которые возвращаются моим действием контроллера. Как изменить результат при вызове ActionResult::ExecuteResult?
 – 
roryf
6 Ноя 2009 в 13:29