请帮助我弄清楚此代码有什么问题:

我有一个可见一个按钮的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持续一个钥匙值,然后允许您从某种形式的存储中检索对象状态。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top