【发布时间】:2011-03-13 23:42:35
【问题描述】:
我尝试了两种方法:Response.Redirect() 什么都不做,以及在基本控制器内部调用一个返回 ActionResult 并让它返回 RedirectToAction() 的新方法......这些都不起作用。
如何从 OnActionExecuting 方法进行重定向?
【问题讨论】:
标签: c# asp.net-mvc onactionexecuting
我尝试了两种方法:Response.Redirect() 什么都不做,以及在基本控制器内部调用一个返回 ActionResult 并让它返回 RedirectToAction() 的新方法......这些都不起作用。
如何从 OnActionExecuting 方法进行重定向?
【问题讨论】:
标签: c# asp.net-mvc onactionexecuting
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
...
if (needToRedirect)
{
...
filterContext.Result = new RedirectResult(url);
return;
}
...
}
【讨论】:
new RedirectToAction(string action, string controller)代替new RedirectResult(url)。在您发布答案后,这可能已添加到 MVC。无论如何,你的解决方案让我走上了正轨。
new) RedirectToAction:filterContext.Result = RedirectToAction(string action, string controller);
也可以这样做:
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();
}
}
【讨论】:
RouteValueDictionary 构造函数的这个 匿名对象,因为它反映了 MVC 中其他地方的路由。 +1
如果重定向控制器继承自同一个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" }
});
}
}
}
【讨论】: