C# 会话中在何处保留querystring参数?

C# 会话中在何处保留querystring参数?,c#,asp.net,C#,Asp.net,用户将使用特定参数访问我的网站,例如: 或 每次我在QueryString中找到这个特殊参数时,我都希望将它的值存储在会话中。我目前正在使用Global.asax中的Session_Start事件来存储该值,但我希望在每次参数值更改时覆盖该值,这在我的方式中是不可能的 您将在哪里执行此操作?如果存在,为什么不将其存储在页面\u Load事件中?如果未引用会话值 您甚至可以创建一个基本页面,用于检查您感兴趣的QueryString是否存在 带有访问此值的公共属性的母版页也很有用,例如: // i

用户将使用特定参数访问我的网站,例如: 或

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


您将在哪里执行此操作?

如果存在,为什么不将其存储在
页面\u Load
事件中?如果未引用
会话

您甚至可以创建一个基本页面,用于检查您感兴趣的
QueryString
是否存在

带有访问此值的公共属性的母版页也很有用,例如:

// 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

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

在页面加载过程中,在每个页面上都会发生此查询字符串

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

有[至少]两种方法可以做到这一点

1) 使用HttpModule连接到应用程序的BeginRequest方法,如中所述

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

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

字符串StrQuery

StrQuery=Request.QueryString[“value”].ToString()


Session[“SessionValue”]=StrQuery

尝试将它从
会话\u Start
移动到
应用程序\u BeginRequest

事实上,会话不可用是应用程序\u BeginRequest:它抛出一个异常,表示“会话状态在此上下文中不可用”,HttpContext.Current.Session为null。不过,您间接地向我指出了会话可用的应用程序状态事件!回答得很好,但我忘了提到我已经从System.Web.Page继承了一些基类,我不想在几个地方修改Page_Load事件。我一直在寻找一个更全局的解决方案。在这种情况下,我建议使用#1,因为它将在应用程序级别挂接一个,或者创建一个公共基类,其他所有基类都从中继承,即100%公共基类,把这个和其他100%通用代码放在一个类中。这个解决方案显然是可行的,但修改每个页面加载事件对我来说不是一个选项。