【问题标题】:Where to keep a querystring parameter in session?在会话中在哪里保留查询字符串参数?
【发布时间】:2010-05-27 00:45:32
【问题描述】:

用户将使用特定参数访问我的网站,例如: http://www.mysite.com/whatever/?keepTrackOfThisValue=foo 或者 http://www.mysite.com/who/cares/?keepTrackOfThisValue=bar

每当我在 QueryString 中找到这个特殊参数的值时,我都想将它存储在 Session 中。我目前正在 Global.asax 中使用 Session_Start 事件来存储它,但我想在每次参数值更改时覆盖该值,这不可能。

你会在哪里做这个?

【问题讨论】:

    标签: c# asp.net


    【解决方案1】:

    尝试将其从 Session_Start 移动到 Application_BeginRequest

    【讨论】:

    • 事实上 Session is not available is Application_BeginRequest :它抛出一个异常说“会话状态在此上下文中不可用”并且 HttpContext.Current.Session 为空。不过,您间接向我指出了 Session 可用的 Application_AcquireRequestState 事件!
    【解决方案2】:

    [至少]有两种方法可以解决这个问题……

    1) 使用 HttpModule 挂钩到应用程序的 BeginRequest 方法,如 this page 中所述。

    2) 创建一个基类(继承自 System.Web.Page),应用程序中的所有页面都从该基类继承。然后使用此基类中的 Page_Load 方法将相同的功能推送到您的所有页面中。这还允许您在加载时或任何其他事件中在所有页面中添加您可能需要的任何其他常见功能。您还可以使用它来定义所有页面的通用属性。

    我从未尝试过#1,但我在我编写的每个 Web 应用程序中都使用了#2。例如,在我的 PageBase 类中,我提供了一个只读的基本属性,它公开了一个数据库连接获取机制,因此每个页面都可以轻松访问数据库,而无需编写自己的代码来从池中获取连接。它可以使代码整体上更简洁。

    【讨论】:

    • 很好的答案,但我忘了提到我已经有一些从 System.Web.Page 继承的基类,我不想在几个地方修改 Page_Load 事件。我一直在寻找更全球化的解决方案。
    • 在这种情况下,我建议使用#1,因为这将在应用程序级别挂钩,或者创建一个您的其他人都继承的通用基类,即您的 100% 通用基类,并将这个和任何其他 100% 通用的代码放在那个类中。
    【解决方案3】:

    这取决于我是如何使用它的,但我做过类似的一件事是静态类上的一个小包装器属性,当调用 getter 时,如果查询字符串不同,它可以选择设置 Session,然后返回会话

    【讨论】:

      【解决方案4】:

      在可能出现此查询字符串的每个页面的 page_load 期间执行此操作

      if(Session["keyName"] != null)
      {
        Session["permitError"] = querysting;
      }
      else
      {
         Session.Add("keyName", value);
      }
      

      【讨论】:

      • 这个解决方案显然有效,但修改每个 Page_Load 事件对我来说不是一个选项。
      【解决方案5】:

      字符串查询;

      StrQuery=Request.QueryString["value"].ToString();

      Session["SessionValue"]=StrQuery;

      【讨论】:

        【解决方案6】:

        如果存在,为什么不将它存储在Page_Load 事件中?如果它不引用Session 值。

        您甚至可以创建一个基本页面,您的所有页面都继承自该页面,以检查您感兴趣的 QueryString 是否存在。

        带有公共属性的MasterPage 也可以访问此值,例如:

        // in your master page
        public string YourSessionVariable
        {
            get
            {
                string yourValue = "SomeDefault";  // if session expired and param not passed
                if (Request.QueryString["yourQueryParamName"] != null)
                {
                    Session["yourSessionParamName"] = Request.QueryString["yourQueryParamName"];
                }
                return (Session["yourSessionParamName"] == null) ?
                    yourValue : Session["yourSessionParamName"].ToString();
            }
        }
        
        // Then in your pages your can just fetch it anytime with
        Master.YourSessionVariable
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-04-15
          • 2014-11-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-02-12
          • 1970-01-01
          • 2012-03-06
          相关资源
          最近更新 更多