Answers:
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
构造函数,因为它可以镜像MVC中其他地方的路由。+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。无论如何,您的解决方案使我走上了正确的轨道。