会话变量在VB.NET中设置但在C#中没有

时间:2018-02-06 03:16:54

标签: c# asp.net webforms

我在项目中使用ASP.NET。我试图设置一个会话变量并在aspx文件中访问它的值。

在VB.NET中,我将会话变量设置为:

Partial Class MainSite_Default
    Inherits System.Web.UI.Page
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Session("TestVariable") = "Lorem ipsum"
    End Sub
End Class

在相应的aspx文件中,我可以使用<%=Session("TestVariable")%>访问其值。

这很好用。但是,现在让我说我在C#中重写它,并尝试类似地设置会话变量:

public partial class Mainsite_Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e) {
        Session["TestVariable"] = "Lorem ipsum";
    }
}

再一次,在aspx文件中,我尝试使用<%=Session["TestVariable"]%>访问其值。

在这种情况下,Session["TestVariable"]为空。该值似乎没有被分配。我也尝试过将Session更改为HttpContext.Current.Session而没有运气。

我在C#中设置会话变量是错误的吗?

有趣的是,如果我在MasterPageFile中设置会话变量,那么我可以在aspx文件中访问它。但是,如果我将它放在Page_Load类的Mainsite_Default方法中,那就不行了。但是,如果我在VB.NET中的Page_Load方法中设置变量,它可以正常工作。

3 个答案:

答案 0 :(得分:0)

事实证明,AutoEventWireup在页面顶部的页面指令中设置为false。这阻止了页面加载事件的触发。当我将其更改为true时,一切都按预期开始工作。

经过进一步调查后,看起来它在VB.NET中有效,因为Handles Me.Load行显式指定了在加载页面时调用哪个方法,即使AutoEventWireup设置为false 。但是C#没有Handles个关键字,因此必须使用+=运算符或AutoEventWireup分配事件。

感谢大家的建议。总的来说,他们确实引导我走向解决方案。

答案 1 :(得分:-1)

尝试此操作来声明会话

public static string TestSessionValue 
{ 
    get 
    {
        object value = HttpContext.Current.Session["TestSessionValue"];
        return value == null ? "" : (string)value;
    }
    set 
    {
        HttpContext.Current.Session["TestSessionValue"] = value;
    }
}

已经解决: 参考文献:How to declare session variable in C#?

答案 2 :(得分:-1)

在某些情况下,会话状态可以为null,以确保您没有获得NullReference异常,最好先检查它。它还优先将字符串存储在变量中,然后将其分配给会话变量。

public partial class Mainsite_Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e) {
        string str = "Lorem ipsum";
        Session["TestVariable"] = str;
    }
}

访问其值

if (Session["TestVariable"] != null)
{
    string value = Session["TestVariable"].ToString(); // Don't forget ToString()
}

有关会话变量何时为空的详细信息,请参阅this答案。 以下是答案的一部分

  

是的,Session对象可能为null,但仅限于某些   情况,你很少会遇到:

     
      
  1. 如果您已禁用SessionState http模块,请禁用   会议
  2.   
  3. 如果您的代码在HttpApplication.AcquireRequestState之前运行

  4.   
  5. 您的代码在IHttpHandler中运行,但未指定   IRequiresSessionState或IReadOnlySessionState接口。如果您只有页面中的代码,则不会遇到此问题。我的大多数ASP .NET   代码使用Session而不重复检查null。它是,   但是,如果你正在开发一个IHttpModule,那就要考虑一下   或者在ASP .NET的粗略细节中落后。

  6.