何もしない Response.Redirect() と、ActionResult を返す Base Controller 内で新しいメソッドを呼び出して RedirectToAction() を返すという 2 つの方法を試しました。どちらも機能しません。
OnActionExecuting メソッドからリダイレクトするにはどうすればよいですか?
何もしない Response.Redirect() と、ActionResult を返す Base Controller 内で新しいメソッドを呼び出して RedirectToAction() を返すという 2 つの方法を試しました。どちらも機能しません。
OnActionExecuting メソッドからリダイレクトするにはどうすればよいですか?
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
...
if (needToRedirect)
{
...
filterContext.Result = new RedirectResult(url);
return;
}
...
}
この方法でも実行できます。
filterContext.Result = new RedirectToRouteResult(
new RouteValueDictionary
{
{"controller", "Home"},
{"action", "Index"}
}
);
別のクラスを作成し、
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"
}));
}
}
}
次に、コントローラーを作成するときに、このアノテーションを次のように呼び出します
[RedirectingAction]
public class TestController : Controller
{
public ActionResult Index()
{
return View();
}
}
リダイレクトされたコントローラーbaseController
が、メソッドをオーバーライドした場所と同じものを継承すると、OnActionExecuting
再帰ループが発生します。アカウントコントローラーのログインアクションにリダイレクトすると仮定すると、ログインアクションはOnActionExecuting
メソッドを呼び出し、同じログインアクションに何度もリダイレクトされます
...したがって、チェックインOnActionExecuting
メソッドを適用して、リクエストが同じコントローラーからのものであるかどうかを確認する必要があります。そうであれば、ログインアクションを再度リダイレクトしないでください。コードは次のとおりです。
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
try
{
// some condition ...
}
catch
{
if (filterContext.Controller.GetType() != typeof(AccountController))
{
filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary {
{ "controller", "Account" },
{ "action", "Login" }
});
}
}
}