如何从 returnUrl 中排除一些操作方法

How to exclude some action methods from returnUrl

我正在使用 returnUrl 到 return 在因不活动而注销后登录时上次请求的页面。这本身就可以正常工作,除非用户不请求页面,而是请求其他操作。我想要的是,如果 SessionTimeOut 之后的第一个操作是 "addItem",returnUrl 设置为 "controller/index" 而不是 "controller/addItem"。

在 SessionTimeOut 之后,应用程序不会自动重定向到登录页面。一旦用户在 SessionTimeOut 之后发出新请求(根据客户端的请求),重定向就会发生。因此,当用户单击菜单项时,returnUrl 将设置为请求的页面。到目前为止很棒。 问题是当用户单击例如 returnUrl 被设置为链接到该按钮的操作方法的 addItem 按钮时。我不明白如何从 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"。(确定)

如果用户在主页上并在 SessionTimeOut 之后发出对 "addItem" 的请求,returnUrl 应该是 "controller/MainPage" 而不是 "controller/addItem"

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

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

我给你举个简单的例子:

    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;
                }
            }

        }
    }

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

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

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

希望这对您有所帮助。