题
请帮助我弄清楚此代码有什么问题:
我有一个可见一个按钮的ASP.NET页面。
当用户单击它时 - 它实例myClass(其实现在AppCode目录中),并转动不可见(Button2变得可见)。
当我单击按钮2时,它会升级“对象引用未设置为对象的实例”异常。
似乎有什么问题?
{
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
}
}
解决方案
因为在后备后,没有重新创建对MyClass的最新引用。
您可以将其添加到ViewState中以保持对它的参考。 (假设MyClass是可序列化的)。
在button1_click中:
ViewState("noviTest") = noviTest;
然后在button2_click中:
var noviTest = ViewState("noviTest");
其他提示
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
要在每个页面请求上进行实例化,无论单击哪个按钮。这可能不是您特定应用程序的最佳解决方案(我不熟悉此类的其余逻辑),但是您明白了。
每次访问代码范围都有点像从头开始运行代码,在访问到页面之间没有设置或保留任何内容。
因此,当您点击第二个按钮时,Novitest不会初始化,因此,当您尝试致电时。获取null引用异常。
为了解决这个问题,您需要确保初始化新手。如果您想在访问页面之间将其持续存在,则需要使用某些机制存储或重新创建实例。要存储它,您将(可能)使用会话。要重新创建您将使用Session或ViewData持续一个钥匙值,然后允许您从某种形式的存储中检索对象状态。
不隶属于 StackOverflow