将会话变量存储在动作过滤器或静态方法中

时间:2014-01-07 21:54:30

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

现在我正在使用会话变量来存储一个布尔值,然后我在我的视图中使用它。我知道HttpContext.Session []变量是静态的,但这是否意味着我需要将它们存储在静态方法中,或者我可以将它们保存在我的动作过滤器中并直接从那里调用它们吗?

控制器:

public class AuthorizationFilterAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        base.OnActionExecuting(filterContext);

        // If not authorized, redirect to login page
        if (true)
        {
            authorized = false;
            filterContext.HttpContext.Session["authorized"] = authorized;


            filterContext.Result = new RedirectResult("https://www.website.com");
        }
        else
        {
            filterContext.HttpContext.Session["authorized"] = authorized;
        }
...

查看:

@{var authorized = (bool)Session["authorized"];}
@if (authorized != null)
{
    if (authorized == true)
    {
        <li><a href="/">Download</a></li>
    }  
}

我应该将会话变量存储在下面的静态方法中并调用它们,而不是我上面做的吗?

    public static bool Authorized(){
        return (bool)HttpContext.Current.Session["authorized"];
    }

2 个答案:

答案 0 :(得分:2)

是的,您可以像没有问题一样调用Session变量。

顺便说一下,

@{var authorized = (bool)Session["authorized"];}

如果Session["authorized"] == null

会抛出异常。

更新

通用实用程序函数通常是静态的,因为它们很容易以这种方式使用(每次要使用功能时都不需要创建类实例)。

System.Web.HttpContext.Current.Session对象(获取HttpSessionState所包含的System.Web.Mvc.ActionExecutingContext对象)可用于应用程序中任何位置的当前HTTP请求。它不需要特别属于静态方法。它可以,如果你想,但它没有。

答案 1 :(得分:1)

你正在以正确的方式做到这一点。您应该直接使用Session变量。无需使用静态方法。会话变量可用于该用户会话。它们不是静态变量(即类级变量)