我试图创建一个操作筛选器,以便在用户有未确认的电子邮件地址时将用户重定向到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();
。我不认为这会是一个问题,因为之前,我把我的会话它叫,但我想这是
作为一个在黑暗中疯狂刺伤,是否改变if语句为:'if(!await UserManager.IsEmailConfirmedAsync(user.Id).ConfigureAwait(false))'工作? –
我知道我的if语句不是问题,因为当我调试时,我发现它使它成为if语句,并且Session [“ConfirmEmail”]实际上等于true。但是,一旦它进入我的过滤器类,'filterContext.HttpContext.Session [“ConfirmEmail”]'是错误的 –
@EitanK - 是'false'或'“false”'?你将会话变量设置为字符串'“true”',但期望类型cast'(bool)Session [...]'工作 - 它不会。您需要将变量设置为布尔值“true”,或者使用“System.Convert.ToBoolean(...)'进行转换。 – Igor