Respostas:
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
...
if (needToRedirect)
{
...
filterContext.Result = new RedirectResult(url);
return;
}
...
}
newRedirectToAction):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 baseControllerem que substituímos o OnActionExecutingmé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 OnActionExecutingmétodo e será redirecionada para a mesma ação de login repetidamente ... Portanto, devemos aplicar um OnActionExecutingmé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.