回答:
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
...
if (needToRedirect)
{
...
filterContext.Result = new RedirectResult(url);
return;
}
...
}
new
)RedirectToAction:filterContext.Result = RedirectToAction(string action, string controller);
別のクラスを作成し、
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();
}
}
RouteValueDictionary
コンストラクターにはこの匿名オブジェクトを使用します。+1
リダイレクトされたコントローラーbaseController
が、OnActionExecuting
メソッドをオーバーライドしたものから継承すると、再帰ループが発生します。私たちは、アカウントコントローラのログインアクションにリダイレクトとし、その後、ログインアクションが呼び出すOnActionExecuting
メソッドをし、何度も何度も同じログインアクションにリダイレクト...我々はチェックを適用する必要がありますので、OnActionExecuting
場合には、同じコントローラからの要求である天気予報をチェックする方法そのため、再度ログインアクションをリダイレクトしないでください。ここにコードがあります:
保護されたオーバーライド。
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)
を使用することもできますnew RedirectToAction(string action, string controller)
。これは、回答を投稿した後にMVCに追加された可能性があります。あなたの解決策はとにかく私を正しい軌道に乗せました。