【问题标题】:Session variable gets set in VB.NET but not in C#会话变量在 VB.NET 中设置,但在 C# 中没有
【发布时间】:2018-02-06 03:16:53
【问题描述】:

我正在为一个项目使用 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 文件中访问它。但如果我将它放在我的Mainsite_Default 类的Page_Load 方法中,则不会。但是,如果我在 VB.NET 的 Page_Load 方法中设置变量,它就可以正常工作。

【问题讨论】:

  • 应该可以。试试:<%=(string)Session["TestVariable"]%> 看看它是否会产生差异。
  • 你检查过 Session["TestVariable"] = "Lorem ipsum";语句被命中,使用调试器?

标签: c# asp.net webforms


【解决方案1】:

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

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

感谢大家的建议。总的来说,他们肯定会引导我找到解决方案。

【讨论】:

    【解决方案2】:

    试试这个来声明会话

    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#?

    【讨论】:

    • 这段代码检查是否为空;但是,它不应该为空。问题是为什么它在明确设置时为空。
    • 当您从会话中调用数据时,如果没有存储会话,则默认情况下处理返回语句中的错误
    • 但它被存储了为什么它会为空?
    • @FadlyRahman 问题中说明变量已设置。或者至少存在应该设置它的代码。您答案中的代码除了将对象转换为字符串之外没有什么不同,这不会改变任何东西。
    • @FadlyRahman 你的意思是如果会话中没有TestSessionValue 它将为空?当然。但这无济于事。
    【解决方案3】:

    在某些情况下会话状态可以为空,以确保您没有收到 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 对象可能为空,但仅在某些情况下 很少会遇到的情况:

    1. 如果您禁用了 SessionState http 模块,请禁用 全部会话
    2. 如果您的代码在 HttpApplication.AcquireRequestState 之前运行

    3. 您的代码在 IHttpHandler 中运行,它没有指定 IRequiresSessionState 或 IReadOnlySessionState 接口。如果您只有页面中的代码,您将不会遇到这种情况。我的大部分 ASP .NET 代码使用 Session 而不重复检查 null。它是, 但是,如果您正在开发 IHttpModule,需要考虑一些事情 否则,在 ASP .NET 的更严密的细节中。

    【讨论】:

      猜你喜欢
      • 2011-08-24
      • 2015-04-09
      • 2012-07-20
      • 1970-01-01
      • 1970-01-01
      • 2014-01-23
      • 2018-05-02
      • 2014-07-13
      • 1970-01-01
      相关资源
      最近更新 更多