null参照例外onclickでプロパティにアクセスするとき
質問
このコードの何が問題なのかを理解するのを手伝ってください:
1つのボタンが表示されているASP.NETページがあります。
ユーザーがクリックすると、MyClass(その実装はAppCode Directoryにあります)をインスタンスし、見えないようになります(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
}
}
解決
ポストバックでは、MyClassへのNovitest言及は再現されていません。
それを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
どのボタンがクリックされたかに関係なく、各ページリクエストにインスタンス化する。これはあなたの特定のアプリケーションにとって最良の解決策ではないかもしれません(私はこのクラスの残りのロジックに不慣れです)が、あなたはアイデアを得ることができます。
Code-Behindへの各訪問は、コードをゼロから実行するようなものであり、ページへの訪問の間に設定されたり、保存されたりするものはありません。
したがって、2番目のボタンを押すと、novitestが初期化されていないため、.getidに電話をかけようとすると、null参照例外が得られます。
これに対処するには、Novitestが初期化されていることを確認する必要があります。ページへの訪問の間に持続したい場合は、インスタンスを保存または再作成するために何らかのメカニズムを使用する必要があります。保存するには、(おそらく)セッションを使用します。再作成するには、セッションまたはviewDataのいずれかを使用して、キー値を持続し、その後、何らかのストレージからオブジェクト状態を取得できるようにします。