在我的控制器中的大多数操作中,我需要检查条件是否已满足,如果没有将用户重定向到同一控制器中的另一个Action,我尝试:
public ActionResult Transactions() { GrossGalsConfermation(); return View(); } public void GrossGalsConfermation() { if (Session["HasConfirmed"] == null && TerminalUserData.IsGrossGallonTerminal) { RedirectToAction("ConversionFactors"); } }
但即使if
声明为真,RedirectToAction
也不会执行.我已经在VS中完成了一个调试,可以看到它从跳转Action
到Method
,评估IF
语句并进入它运行RedirectToAction
但是然后它跳回到调用Acation
并返回它的视图.如何强制它重定向?在线搜索我发现类似的问题,解决方案是改变为void
,ActionResult
但后来我必须提供一个Action
无法完成的回退,因为这Method
将被几十个视图调用.
一切RedirectToAction
都是返回RedirectToRouteResult
- 除非您实际返回,否则浏览器不会被重定向.由于您不希望在您的方法中执行此操作(您可以返回null并在操作中执行null检查但它会很笨拙),我建议使用操作过滤器.像下面这样的东西会这样做:
public class GrossGalsFilterAttribute : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext filterContext) { if (Session["HasConfirmed"] == null && TerminalUserData.IsGrossGallonTerminal) { filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { controller = "MyController", action = "ConversionFactors" })); } base.OnActionExecuting(filterContext); } }
然后装饰你的控制器动作:
[GrossGalsFilter] public ActionResult MyControllerAction
请注意,您可能需要修改过滤器以获取TerminalUserData.IsGrossGallonTerminal
- 根据您的问题无法知道它来自何处.
有关动作过滤器的更多信息:http://msdn.microsoft.com/en-us/library/dd381609(v = vs.100).aspx