【问题标题】:ASPX Session State null exception on Postback回发时的 ASPX 会话状态空异常
【发布时间】:2017-02-25 01:46:29
【问题描述】:

我似乎无法在回发时读取会话变量,即使使用以下简单代码:

默认.apsx:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" 

Inherits="_Default" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    </div>
        <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" AutoPostBack="true" Text="Button" />
    </form>
</body>
</html>

代码隐藏:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (IsPostBack)
        {
            varcheck(Session["MyVar"].ToString());
        }
    }

    protected void varcheck(string checker)
    {
        System.Diagnostics.Debug.WriteLine(checker);
    }

    protected void Button1_Click(object sender, EventArgs e)
    {
        string ret_val = "Return this on postback";
        Session["MyVar"] = ret_val; 

    }
}

我明白了:

An exception of type 'System.NullReferenceException' occurred in App_Web_5mcbvlrk.dll but was not handled in user code
Additional information: Object reference not set to an instance of an object.

我错过了什么吗?会话变量不应该在单击按钮时设置并在回发时读取吗?需要全局设置吗?

【问题讨论】:

  • 请停止使用会话

标签: c# asp.net session state postback


【解决方案1】:

这是因为当您单击按钮时,它不会直接转到 Button1_Click 事件,它会从上到下运行,因此它会先加载 Page_Load 然后再转到事件,因此您应该进行检查

      if (IsPostBack && Session["MyVar"] != null)
        {
            varcheck(Session["MyVar"].ToString());
        }

如果Session["MyVar"] 不是null 因为它将在第一个postback 中为空,它不会抛出异常

编辑 1

如果不想使用会话,可以使用静态变量来存储数据

    public static string MyVar;
    protected void Page_Load(object sender, EventArgs e)
    {


    if (!string.IsNullOrWhiteSpace(MyVar))
    {
        varcheck(MyVar);
    }
}

你可以在点击时设置值

protected void Button1_Click(object sender, EventArgs e)
    {
      if (string.IsNullOrWhiteSpace(MyVar))
      {
        MyVar= "Return this on postback";
        varcheck(MyVar);

      }

    }

【讨论】:

  • 所以要获得回发的实际价值,从技术上讲,我必须进行 2 次回发?有没有更好的替代方法来设置变量并在回发时正确读取它?
  • 可以声明一个静态字段来存储数据
  • 所以同样适用 - 第一次回发,静态字符串为空,第二次回发,静态字符串是想要的值......我想另一种方法是做一个 javascript 客户端如果我想在当前回发中检索它,则使用字符串回发。有没有办法在纯代码隐藏中实现这一点?
  • 感谢您帮助我更好地理解回发例程,这对我来说更有意义。我最终使用了 javascript __doPostBack 方法,它似乎运行良好。
猜你喜欢
  • 2014-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多