从方法内重定向到操作

 yuhemecy_883 发布于 2023-02-07 19:02

在我的控制器中的大多数操作中,我需要检查条件是否已满足,如果没有将用户重定向到同一控制器中的另一个Action,我尝试:

    public ActionResult Transactions()
    {
        GrossGalsConfermation();
        return View();
    }

    public void GrossGalsConfermation()
    {
        if (Session["HasConfirmed"] == null && TerminalUserData.IsGrossGallonTerminal)
        {
            RedirectToAction("ConversionFactors");
        }
    }

但即使if声明为真,RedirectToAction也不会执行.我已经在VS中完成了一个调试,可以看到它从跳转ActionMethod,评估IF语句并进入它运行RedirectToAction但是然后它跳回到调用Acation并返回它的视图.如何强制它重定向?在线搜索我发现类似的问题,解决方案是改变为void,ActionResult但后来我必须提供一个Action无法完成的回退,因为这Method将被几十个视图调用.

1 个回答
  • 一切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

    2023-02-07 19:05 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有