在OnClick中访问属性时出现Null引用异常

时间:2010-04-24 15:21:12

标签: c# asp.net app-code

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

我有一个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
    }
}

3 个答案:

答案 0 :(得分:5)

因为在回发时,不会重新创建对MyClass的noviTest引用。

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

ViewState("noviTest") = noviTest;

然后在Button2_Click:

var noviTest = ViewState("noviTest");

答案 1 :(得分:1)

noviTestButton2_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在每个页面请求上实例化,无论单击哪个按钮。这可能不是您特定应用程序的最佳解决方案(我不熟悉本课程中的其他逻辑)但您明白了。

答案 2 :(得分:1)

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

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

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