Respostas:
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
...
if (needToRedirect)
{
...
filterContext.Result = new RedirectResult(url);
return;
}
...
}
new
RedirectToAction):filterContext.Result = RedirectToAction(string action, string controller);
Também pode ser feito desta maneira:
filterContext.Result = new RedirectToRouteResult(
new RouteValueDictionary
{
{"controller", "Home"},
{"action", "Index"}
}
);
Crie uma classe separada,
public class RedirectingAction : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext context)
{
base.OnActionExecuting(context);
if (CheckUrCondition)
{
context.Result = new RedirectToRouteResult(new RouteValueDictionary(new
{
controller = "Home",
action = "Index"
}));
}
}
}
Então, quando você cria um controlador, chame esta anotação como
[RedirectingAction]
public class TestController : Controller
{
public ActionResult Index()
{
return View();
}
}
RouteValueDictionary
construtor, pois ele reflete o roteamento em outro lugar no MVC. +1
Se o controlador redirecionado herdar do mesmo baseController
em que substituímos o OnActionExecuting
método, causamos loop recursivo. Suponha que o redirecionemos para a ação de login do controlador de conta, a ação de login chamará o OnActionExecuting
método e será redirecionada para a mesma ação de login repetidamente ... Portanto, devemos aplicar um OnActionExecuting
método de check-in para verificar se a solicitação é do mesmo controlador se portanto, não redirecione novamente a ação de login. aqui está o código:
substituição protegida.
void OnActionExecuting(ActionExecutingContext filterContext)
{
try
{
some condition ...
}
catch
{
if (filterContext.Controller.GetType() != typeof(AccountController))
{
filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary { { "controller", "Account" }, { "action", "Login" } });
}
}
}
new RedirectResult(url)
você também pode usarnew RedirectToAction(string action, string controller)
. Isso pode ter sido adicionado ao MVC depois que você postou sua resposta. Sua solução me colocou no caminho certo de qualquer maneira.