从方法内重定向到操作

时间:2013-12-27 21:50:48

标签: c# asp.net-mvc

在我的控制器中的大多数操作中,我需要检查条件是否已满足,如果没有将用户重定向到同一控制器中的另一个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}将被许多观点调用。

3 个答案:

答案 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