【问题标题】:How to exclude some action methods from returnUrl如何从 returnUrl 中排除一些操作方法
【发布时间】:2026-02-07 12:10:01
【问题描述】:

由于不活动而退出登录后,我正在使用 returnUrl 返回上一个请求的页面。这本身就可以正常工作,除非用户不请求页面,而是请求其他操作。我想要的是,如果 SessionTimeOut 之后的第一个操作是例如“addItem”,returnUrl 设置为“controller/index”而不是“controller/addItem”。

在 SessionTimeOut 之后,应用程序不会自动重定向到登录页面。一旦用户在 SessionTimeOut 之后发出新请求(根据客户端的请求),重定向就会发生。所以当用户点击一个菜单项时,returnUrl 被设置为请求的页面。到目前为止很棒。 问题在于,例如当用户单击 addItem 按钮时,returnUrl 被设置为链接到该按钮的操作方法。我不明白如何从 returnUrl 中排除这种方法。

这是一个非常缩小的应用程序示例,以说明它是如何挂在一起的。

主控制器:

public ActionResult MainPage(){
   return View();
}

public ActionResult addItem(){
   --- Do Something ---
}

public ActionResult SecondPage(){
   return View();
}

登录方式:

public ActionResult Login([Binde(Include = "UserName, Password")]LoginModel model, string returnUrl)
{
   if(Modelstate.IsValid)
   {
      --- Do Validation ---
      return Redirect(returnUrl);
   }
}

如果用户在 MainPage 上并在 SessionTimeOut 之后请求“SecondPage”,则 returnUrl 应该是“controller/SecondPage”。(OK)

如果用户在 MainPage 上并在 SessionTimeOut 之后请求“addItem”,returnUrl 应该是“controller/MainPage”而不是“controller/addItem”

【问题讨论】:

    标签: asp.net-mvc returnurl


    【解决方案1】:

    一个快速的解决方案是让动作过滤器生效。 您可能知道,动作过滤器是一种属性,您可以将其应用于控制器动作——或整个控制器——修改动作的执行方式。更多详细信息,请参阅文档here

    在这种情况下,你需要重写 OnActionExecuting 方法,在控制器动作执行之前调用,这样在执行之前,你可以根据返回值来决定是否重定向。

    我给你举个简单的例子:

        public class myCheckUrlActionFilter : ActionFilterAttribute
        {
            public override void OnActionExecuting(ActionExecutingContext filterContext)
            {
                List<string> avoidList = new List<string> { "addItem", "removeItem"};
    
                foreach(string i in avoidList)
                {
                    if(filterContext.HttpContext.Request.Url.Query.Contains(i))
                    {
                        filterContext.Result = new RedirectResult("/Home/MainPage") ;
                        break;
                    }
                }
    
            }
        }
    

    现在,让我们将此过滤器应用于 Home Controller 中的所有操作方法,尽管您可以将它单独应用于某些操作方法。

    [myCheckUrlActionFilter]
    public class HomeController : Controller
    { .... }
    

    访问过滤器主体内的HttpContext,可以提取会话,甚至是当前控制器和动作名称。因此,您可以在此处检查会话状态以及 returnUrl 是否存在以进一步决定重定向。因此,请根据需要对其进行自定义。

    希望这会有所帮助。

    【讨论】:

    • 谢谢!我将不得不看看如何使其适应我的应用程序,但您的回答确实帮助我走上了正轨!
    • 很高兴它对您有所帮助。如果在代码定制期间需要,请在此处评论。谢谢。