检查会话项是否存在失败,出现对象引用未设置错误。

9

我在处理会话项目时遇到了问题。在使用它们之前,我想检查它们是否存在,但是使用这些代码会给我带来错误:

If (Session("SomeSessionItem") Is Nothing) Then
...
End If

出现了以下错误:

对象引用未设置为对象的实例。

我认为Session("SomeSessionItem")试图获取会话项的值。如果该项不存在,则会抛出异常。但是,在使用它们之前,如何检查会话项是否存在?

  • 我有一个名为Home.aspx的页面。
  • Home.aspx.vb中,我实例化了一个WebUserControl SomeControl.ascx。请注意,在Home.aspx.vb事件处理程序Page_Load中,我可以使用条件来检查会话而不会出现异常。
  • SomeControl.ascx.vb内部,我正在尝试访问会话,这就是发生异常的地方。

3
你确定 "Session" 对象不是空的吗? - Ankur
@Ankur,会话也不存在!但是为什么?我正在我的ascx.vb或webusercontrol文件中运行它。 - kazinix
请求的控制流是什么?它是一些Ajax调用还是简单的asp.net页面生命周期? - Ankur
你确定在你的情况下不应该是 IsNot Nothing 吗? - Abel
并且:检查EnableSessionState,如果为false,则没有会话。 - Abel
5个回答

13

这个对你可行吗?

If (Session IsNot Nothing)
    Dim item as Object = Session("SomeSessionItem")
    If (item IsNot Nothing)
    ...
    End If
End If

如果你看到以下错误:

该上下文中不存在 Session

除了简单地使用 Session,你还可能需要检查 HttpContext.Current.Session


5
如果在会话对象本身创建之前尝试使用会话,则会出现此行为。请注意,在请求的过程中并不总是可用Session对象。您可以检查Session本身是否为Nothing。
保证在Session_Start事件触发后创建,您可以在global.asax中进行检查。
如果您的代码运行在页面的代码后面,则有一些情况下会话状态尚不可用。但是,在Page_Load中它是可用的,请在那里进行检查。
最后:当为您的页面或应用程序设置.EnableSessionstate="false"时,您无法访问会话对象。

编辑:

也许你的意思是使用以下代码,而不是If (Session("SomeSessionItem") Is Nothing) Then

If (Session("SomeSessionItem") IsNot Nothing) Then
    '... do someting, i.e.:'
    Dim sessionItem As String = CType(Session("SomeSessionItem"), String)

1

你需要在 Session 上使用 Item

If Session.Item("SomeSessionItem") Is Nothing Then
    ' No such value in session state, take appropriate action.
End If

“Item”是默认属性,可以在VB.NET中调用它而不需要使用“Item”(或者他们在最新版本的VB中改变了这个吗?)。 - Abel
我会查看@Abel的答案,并检查Session本身是否为空。 - Peter Kelly

1

你确定错误来自于你的 If 行吗?你在 If 内部做了什么?

我问这个问题是因为你说:

在使用它们之前,我想要检查它们是否存在

然后再检查它们不存在。

我的猜测是,在你的 If 代码块内部,它正在从 Session 中读取值并尝试使用它,而这正是在你检查它不存在之后所发生的错误 :)


0

使用这个

VB.NET

IF HttpContext.Current IS NOTHING Then
   ------Your Code
Else
  ----Your Code
End IF

C#

IF Session("XYZ") == NULL
{
   ---- Your Code
}
Else
{
  ---- Your Code
}

你应该包含一些更多的细节来解释这个方法是如何或为什么解决了原帖作者的问题。仅有代码的回答在大多数情况下并没有提供太多帮助。 - psubsee2003

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接