У меня есть IActionFilter
, который что-то делает в OnActionExecuted
, однако я не хочу выполнять это действие, когда результат контроллера выполняет перенаправление.
Моя первоначальная мысль состояла в том, чтобы проверить тип ActionResult
как RedirectResult
или RedirectToRouteResult
, но это ненадежно, так как любой тип результата может выполнять перенаправление (действительно, у меня есть два пользовательских те, которые делают).
Есть ли другой способ определить, когда это произойдет, или это невозможно, поскольку вы не будете знать о перенаправлении до тех пор, пока действие не будет выполнено (что слишком поздно, чтобы делать то, что я хочу)?
Возможно, просто проверка ViewResult
и PartialViewResult
будет более надежной.
2 ответа
Я бы предложил просто проверить тип результата. Вы можете пометить свои пользовательские действия с помощью «[IsRedirect]», назвать их «... Redirect» или получить от «IRedirectResult» для обнаружения.
Альтернативные решения, которые приходят мне в голову:
- Вместо этого обработайте OnResultExecuted и проверьте, что Result сделал с контекстом HTTP (URL-адрес изменился и т. д.) — не уверен, что это работает.
- Вручную вызовите Result.Execute() с поддельным контекстом и проверьте, что результат сделал с этим поддельным контекстом. Вы можете запомнить свой фальшивый контекст, вызывался ли какой-либо «Перенаправление».
Но просто проверить тип результата намного проще.
... это ненадежно, так как любой тип результата может выполнить перенаправление (действительно, у меня есть два пользовательских, которые делают)
Если они выполняют перенаправление, это необходимо сделать, задав для Result значение RedirectResult или аналогичное, а не только Response.Redirect.
Если это Response.Redirect, то это явно неправильно.
Примером является AuthorizeAttribute, который изменяет результат на HttpUnauthorizedResult.
Таким образом, вы все равно получите ControllerContext.Result и сможете работать с ним.
Кроме того, как насчет применения соглашения: если имя типа ActionResult содержит слово «Redirect», значит, это перенаправление.
var isRedirect = filterContext.ActionResult.GetType().Name.Contains("Redirect");
Если он выглядит как утка, плавает как утка и крякает как утка, то, вероятно, это утка.
Решение конечно не идеальное, но простое и понятное.
Похожие вопросы
Новые вопросы
asp.net-mvc
ASP.NET MVC Framework - это платформа и инструмент веб-приложений с открытым исходным кодом, которые реализуют версию шаблона модель-представление-контроллер (MVC), адаптированную к веб-приложениям и построенную на основе технологии ASP.NET.