1

このコードの何が問題なのかを理解するのを手伝ってください:

ボタンが 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

コード ビハインドへの各アクセスは、コードをゼロから実行するようなもので、ページへのアクセス間で何も設定または保持されません。

したがって、2 番目のボタンを押すと noviTest は初期化されないため、.getID を呼び出そうとすると null 参照例外が発生します。

これに対処するには、noviTest が初期化されていることを確認する必要があります。ページへのアクセス間で永続化したい場合は、何らかのメカニズムを使用してインスタンスを保存または再作成する必要があります。それを保存するには、(おそらく) セッションを使用します。再作成するには、session または viewdata のいずれかを使用してキー値を永続化します。これにより、何らかのストレージからオブジェクトの状態を取得できます。

于 2010-04-24T15:26:46.067 に答える
1

noviTest内部は nullButton2_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 に答える