2015-09-04 72 views
0

我试图创建一个操作筛选器,以便在用户有未确认的电子邮件地址时将用户重定向到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();。我不认为这会是一个问题,因为之前,我把我的会话它叫,但我想这是

+0

作为一个在黑暗中疯狂刺伤,是否改变if语句为:'if(!await UserManager.IsEmailConfirmedAsync(user.Id).ConfigureAwait(false))'工作? –

+0

我知道我的if语句不是问题,因为当我调试时,我发现它使它成为if语句,并且Session [“ConfirmEmail”]实际上等于true。但是,一旦它进入我的过滤器类,'filterContext.HttpContext.Session [“ConfirmEmail”]'是错误的 –

+1

@EitanK - 是'false'或'“false”'?你将会话变量设置为字符串'“true”',但期望类型cast'(bool)Session [...]'工作 - 它不会。您需要将变量设置为布尔值“true”,或者使用“System.Convert.ToBoolean(...)'进行转换。 – Igor

回答

0

我觉得你的逻辑是有点偏离

  1. 尝试越过一个布尔值而该字符串值“真”

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

  3. 你的if语句如果是检查!而不是真正的只是检查真实

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

希望这有助于。

+0

问题是无论传递的值是字符串还是布尔值在调试器到达我的过滤器类时变为null。所以它甚至不会在OnActionExecuting方法中使用第二个if语句。另外,当我将访问权限更改为受保护时,我得到以下错误消息:'在重写'公共'继承成员'System.Web.Mvc.ActionFilterAttribute.OnActionExecuting'时不能更改访问修饰符“ –