我正在尝试创建一个操作过滤器,以便在用户拥有未经证实的电子邮件地址时将用户重定向到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 :(得分:0)
我认为你的逻辑有点偏离
尝试传递一个布尔值而不是字符串值&#34; true&#34;
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
if (!await UserManager<>.IsEmailConfirmedAsync(user.Id))
{
Session["ConfirmEmail"] = true;
RedirectToAction("ConfirmEmail");
}
}
您的OnActionExecuting应使用受保护的访问修饰符
您的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"}
});
}
}
}
希望这有帮助。