1

请帮我弄清楚这段代码有什么问题:

我有一个可见的 ASP.NET 页面。

当用户单击它时 - 它实例化 MyClass (它的实现在 AppCode 目录中)并变为不可见(button2 变为可见)。

当我单击 button2 时,它会引发“对象引用未设置为对象的实例”异常。

似乎是什么问题?

{
    public MyClass noviTest;

    protected void Page_Load(object sender, EventArgs e)
    {
    }

    protected void Button1_Click(object sender, EventArgs e)
    {
        noviTest = new MyClass(TextBox1.Text);
        Button1.Visible = false;
        Button2.Visible = true;
    }

    protected void Button2_Click(object sender, EventArgs e)
    {
        Label1.Text=noviTest.getID; //this is the critical line
    }
}
4

3 回答 3

5

由于在回发时没有重新创建对 MyClass 的 noviTest 引用。

您可以将其添加到视图状态以保留对它的引用。(假设 MyClass 是可序列化的)。
在 Button1_Click 中:

ViewState("noviTest") = noviTest;

然后在 Button2_Click 中:

var noviTest = ViewState("noviTest");
于 2010-04-24T15:23:35.213 回答
1

noviTest内部为空Button2_Click

尝试这样的事情:

protected void Page_Load(object sender, EventArgs e)
{
    noviTest = new MyClass(TextBox1.Text);
}
protected void Button1_Click(object sender, EventArgs e)
{
    Button1.Visible = false;
    Button2.Visible = true;    
}
protected void Button2_Click(object sender, EventArgs e)
{
    Label1.Text = noviTest.getID;
}

这将导致noviTest在每个页面请求上被实例化,而不管单击了哪个按钮。这可能不是您的特定应用程序的最佳解决方案(我不熟悉本课程中的其余逻辑),但您明白了。

于 2010-04-24T15:23:23.307 回答
1

每次访问代码隐藏有点像从头开始运行代码,在访问页面之间没有为您设置或保留任何内容。

因此,当您点击第二个按钮时,noviTest 未初始化,因此当您尝试调用 .getID 时,您会得到一个空引用异常。

要解决这个问题,您需要确保 noviTest 已初始化。如果您想让它在对页面的访问之间保持不变,您需要使用某种机制来存储或重新创建实例。要存储它,您将(可能)使用 session. 要重新创建,您将使用 session 或 viewdata 来保存一个键值,然后允许您从某种存储中检索对象状态。

于 2010-04-24T15:26:46.067 回答