在我的控制器中的大多数操作中,我需要检查条件是否已满足,如果没有将用户重定向到同一控制器中的另一个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
来返回,因为这{{1}将被许多观点调用。
答案 0 :(得分:5)
所有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
答案 1 :(得分:1)
您错过了“返回”:
return RedirectToAction(...);
如果你想多次重复使用这个方法,你应该考虑编写一个过滤器。
答案 2 :(得分:-1)
你的GrossGalsConfirmation()
(拼写为i而不是btw)不会返回任何内容。将其返回类型更改为ActionResult
并返回RedirectToAction
。