c#如何从preinit设置和使用会话状态
好的,从当前会话中设置和读取变量c#如何从preinit设置和使用会话状态,c#,asp.net,session-state,C#,Asp.net,Session State,好的,从当前会话中设置和读取变量 String Myvar =(string) System.Web.HttpContext.Current.Session[“MyVariable”] 设置 System.Web.HttpContext.Current.Session[“MyVariable”] = “NewValue” 我两者都做不到,我从System.Web.HttpContext.Current.Session获得一个System.NullReferenceException:对象引用
String Myvar =(string) System.Web.HttpContext.Current.Session[“MyVariable”]
设置
System.Web.HttpContext.Current.Session[“MyVariable”] = “NewValue”
我两者都做不到,我从System.Web.HttpContext.Current.Session获得一个System.NullReferenceException:对象引用未设置为对象的实例。
在我的web.config中,我有
<sessionState mode="StateServer" stateConnectionString="tcpip=127.0.0.1:42424" cookieless="false" timeout="20">
</sessionState>
我已经读了十几篇关于IHttpHandler
和iRequiresessionState
接口必要性的文章。我认为问题可能是因为我在Page\u PreInit
中请求此信息。我在一篇堆栈溢出文章中发现了一个,但我似乎没有正确地使用它来实现这一点
我不确定我错过了什么。提前感谢。正如前面提到的评论,在
PreInit
事件中,您有什么理由需要它吗
PreInit
发生在页面生命周期的早期。事实上,它发生在母版页(如果有的话)应用之前,在所有控件完全初始化之前,等等
对于大多数应用程序来说,更好的选择是
Load
事件。如果您仍然在那里得到一个NullReferenceException
,那么还有一个更大的问题。要访问会话状态pre init,您可以执行以下操作。我使用它,这样我就可以有一个不同于普通用户的管理主机。每个页面的顶部都有一个方法
PageTools tools = new PageTools();
protected void Page_PreInit(object sender, EventArgs e)
{
tools.setMasterPage(Page, Context);
}
PageTools是我的类,它包含选择适当的主页面并具有http处理程序的方法
public void setMasterPage(Page page, HttpContext context)
/***********************************************************************
* Author Daniel Tweddell
* Date 9/18/09
*
* Several of the pages are for non-admin use, however these pages will
* also be used by the admin users and will need to have the admin menu
* and such. So based on the login, we either show the page with the
* standard master or if the user is admin, use the admin master.
***********************************************************************/
{
if (context.Handler is IReadOnlySessionState || context.Handler is IRequiresSessionState)
{
context.Handler = Handler();
}
String sMasterPage="~/content/page.master";
if (userinfo.IsUserAdmin) sMasterPage="~/content/administrator/admin.master";//make sure the user is admin
page.MasterPageFile = sMasterPage;
}
是设置httphandler的一步一步的过程。(这是您需要的另一件事。您可以通过在类中实现IRequiresessionState接口来访问会话 这是一个标志接口,因此不需要实现任何额外的代码 当您实现此功能时,asp.net将知道您想要访问会话
public partial class YOUR_ASPX: System.Web.UI.Page , IRequiresSessionState
{
... your code
}
如果将该代码移动到Page_Load事件中,它会工作吗?为什么需要在PreInit中使用该代码?请确保ASP.Net状态服务已启动。即使将代码放置在Page_PreInit中,它也会工作。您可以提供更多信息吗?还有一件事,您首先使用哪一行。如果您尚未设置会话[“MyVariable”]并尝试强制转换到(字符串)。它将给您提供空引用错误。因此,请尝试在强制转换之前设置空检查条件。我正在交换母版页-在PreInit上是我唯一知道如何执行此操作的地方。我认为我确实需要在PreInit中执行此操作。我不能访问该点的状态吗?我知道我可以通过问题中链接的解决方案来执行此操作。不幸的是,我缺少som这一难题的一小部分需要实现。对于交换母版页,是的,你需要在PreInit进行。然而,交换母版页依赖于会话状态。除了会话状态之外,还有其他机制可以用来获取交换母版页所需的信息吗?它基于在login。我想我可以通过post和隐藏变量将信息从一页传递到另一页,但是……糟糕。我会将所有用户信息保存在状态中,就像史前传递一样。