【问题标题】:Store session variable in action filter or static method将会话变量存储在操作过滤器或静态方法中
【发布时间】:2014-01-08 06:37:18
【问题描述】:

现在我正在使用会话变量来存储一个布尔值,然后在我的视图中使用它。我知道 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"];
    }

【问题讨论】:

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


    【解决方案1】:

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

    顺便说一句,

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

    如果Session["authorized"] == null 会抛出异常。

    更新

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

    System.Web.HttpContext.Current.Session 对象(获取与 System.Web.Mvc.ActionExecutingContext 包装的相同的 HttpSessionState 对象)可用于来自应用程序中任何位置的当前 HTTP 请求。它不需要专门属于静态方法。如果你愿意,它可以,但它不是必须的。

    【讨论】:

    • 啊,谢谢你的收获。甚至没有注意到这一点。其余的互联网将会话变量存储在静态方法中。在这种情况下,有什么理由不需要这样做?
    【解决方案2】:

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

    【讨论】:

    • 我很高兴听到我是对的 :),但是您能否解释一下为什么我不需要将其放入静态方法中?
    • 我刚刚更新了答案。从静态方法返回 Session 变量没有意义。
    猜你喜欢
    • 2015-11-30
    • 2023-03-11
    • 2019-11-12
    • 2012-01-13
    • 1970-01-01
    • 2010-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多