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