会话变量在操作过滤器中变为空

时间:2015-09-04 13:52:36

标签: c# asp.net asp.net-mvc session session-variables

我正在尝试创建一个操作过滤器,以便在用户拥有未经证实的电子邮件地址时将用户重定向到ConfirmEmail操作。在我的控制器中,我设置了会话变量,在我的动作过滤器中,我检查会话变量是否为空。

    public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
    { 
          // some code here

          if (!await UserManager.IsEmailConfirmedAsync(user.Id))
          {
            Session["ConfirmEmail"] = "true";
          }

         // some code here
     }

    public class ConfirmEmailFilter : ActionFilterAttribute
    {    
          public override void OnActionExecuting(ActionExecutingContext filterContext)
                {
                    if (filterContext.HttpContext.Session["ConfirmEmail"] != null)
                    {
                       if (!(bool)filterContext.HttpContext.Session["ConfirmEmail"])
                       {
                        filterContext.Result = new RedirectToRouteResult(
                            new RouteValueDictionary
                            {
                                {"controller", "Account"},
                                {"action", "ConfirmEmail"}
                            });
                        }
                    }
                 }
      }

我不确定动作过滤器无法读取会话的原因。我应该用另一种方法来实现这项检查吗?

修改

我找到了问题!在我的代码中(在我设置会话之前,我有以下内容) Session.Clear(); Session.Abandon();。我不认为这会是一个问题,因为它在我设置会话之前被调用但我猜它是

1 个答案:

答案 0 :(得分:0)

我认为你的逻辑有点偏离

  1. 尝试传递一个布尔值而不是字符串值&#34; true&#34;

        public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
        {
            if (!await UserManager<>.IsEmailConfirmedAsync(user.Id))
            {
                Session["ConfirmEmail"] = true;
                RedirectToAction("ConfirmEmail");
            }
        }
    
  2. 您的OnActionExecuting应使用受保护的访问修饰符

  3. 您的if语句正在检查是否为!而不是仅仅检查true

    protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (filterContext.HttpContext.Session["ConfirmEmail"] != null)
        {
            if (filterContext.HttpContext.Session["ConfirmEmail"] is bool && (bool) filterContext.HttpContext.Session["ConfirmEmail"])
            {
                filterContext.Result = new RedirectToRouteResult(
                    new RouteValueDictionary
                    {
                        {"controller", "Account"},
                        {"action", "ConfirmEmail"}
                    });
            }
        }
    }
    
  4. 希望这有帮助。