我有一个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
}
}
答案 0 :(得分:5)
因为在回发时,不会重新创建对MyClass的noviTest引用。
您可以将其添加到视图状态以保留对它的引用。 (假设MyClass是可序列化的) 在Button1_Click:
ViewState("noviTest") = noviTest;
然后在Button2_Click:
var noviTest = ViewState("noviTest");
答案 1 :(得分: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
在每个页面请求上实例化,无论单击哪个按钮。这可能不是您特定应用程序的最佳解决方案(我不熟悉本课程中的其他逻辑)但您明白了。
答案 2 :(得分:1)
每次访问代码隐藏都有点像从头开始运行代码,在访问页面之间没有为您设置或保留任何内容。
因此,当您点击第二个按钮时,noviTest未初始化,因此当您尝试调用.getID时,您将获得空引用异常。
要解决此问题,您需要确保noviTest已初始化。如果要在访问页面之间保持持久性,则需要使用某种机制来存储或重新创建实例。要存储它,您可能(可能)使用会话。要重新创建,您可以使用session或viewdata来保存一个键值,然后允许您从某种存储中检索对象状态。