21

「hi」を使用して文字列変数テストを宣言しました。Button1 をクリックするたびに、test に以前の値が追加されることを期待しています。しかし、ボタンをクリックしてページをリロードすると、以前の値が失われることに気付きました。つまり、クリックするたびに、「hihi」というテキストが表示されます。次のクリックなどで「ひひひひ」と期待しています。以下のコードの問題点は何ですか?

public partial class _Default : System.Web.UI.Page
{

    String test = "hi";

    protected void Page_Load(object sender, EventArgs e)
    {

    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        test += test;
        Button1.Text = test;
    }
}
4

8 に答える 8

32

いいえ、それは asp.net の仕組みではありません。その動作が必要な場合は、これを行う必要があります。

public string test {
  get {
    return (string) ViewState["test"] ?? "hi";
  }
  set {
    ViewState["test"] = value;
  }
}

ASP.NET がサーバーに要求を送信すると、新しいバージョンのクラスがインスタンス化されます。状態を取得する必要がある場合は、ViewState (ブラウザの非表示フィールドに保存され、すべてのリクエストで送信されるため、状態はページごとに保存されます) を使用するか、ユーザーごとに保存される状態である SessionState を使用できます。 . デフォルトでは、SessionState はメモリに保存されます。したがって、IIS を再起動すると、この状態はなくなります。IIS をリセットしても、viewstate の状態は消えないことに注意してください (ブラウザーによって送信されているため)。Cacheまた、メモリに保存されている を使用することもできます。この状態はすべてのアプリケーションのユーザー。IIS のリセットに関する同じ規則が適用されます。最後に、変数を静的にすることができます。前述したように、リクエストが行われるたびに、クラスの新しいバージョンがインスタンス化されます。もちろん、静的変数はインスタンス変数ではないため、静的変数の状態はポストバック間でも保存されます。IIS のリセットに関する同じ規則が、静的変数に適用されます。これは、キャッシュとセッションです。

于 2012-05-31T17:36:15.417 に答える
8

フィールドは、単一のリクエストの間のみ存在します。リクエスト間で存続させたい場合は、セッションステート、ビューステート、Cookie、または HTML フォーム / リクエスト値などを使用する必要があります。

ほとんどの「実際の」アプリケーションでは、後続のリクエストが同じ物理マシンによって処理されることさえ保証できません。

于 2012-05-31T17:36:20.923 に答える
5

ページにアクセスするたびに、ローカル変数の独自のコピーを使用してページの新しいインスタンスが作成されます。あるページ ビューから次のページ ビューに値を永続化する方法はいくつかあります。それらはすべてここで説明されています: ASP.NET 状態管理の概要

于 2012-05-31T17:37:28.160 に答える
5
String test = "hi";

これはプライベートなインスタンス クラス フィールドです。

目標を達成したい場合は、静的なものが必要です。

ところで、正直なところ、多分あなたはセッションアイテムを使用しようとしています:

HttpContext.Current.Session["test"] = "hi";

このようにすると、イベント ハンドラーに次のようなコードが作成されます。

string currentTestText = (string)HttpContext.Current.Session["test"];

currentTestText += currentTestText;
Button1.Text = currentTestText;

HttpContext.Current.Session["test"] = currentTestText;
于 2012-05-31T17:37:53.273 に答える
4

コードの問題は、リクエストごとにPageインスタンスが再作成されるため、新しいインスタンスtestに属しているため、以前の値が保持されないことです。Page

フローは次のとおりです。

リクエスト1スタート

Page is created -> test = "hi"

依頼1終了

Page is detroyed

リクエスト2スタート

Page is created -> test = "hi"

リクエスト2終了

Page is detroyed
于 2012-05-31T17:38:08.120 に答える
4

それは、ボタンが POST BACK を生成するため、変数を静的プロパティとして宣言するか、Session["Test"] を作成するか、IsPostback {}

于 2012-05-31T17:36:08.267 に答える
3

ポストバック時に asp.net がオブジェクトを再作成し、値を再割り当てすることに注意してください。あなたの場合、テスト変数が再作成され、「hi」の値が割り当てられます。変数をセッションに保存してから、値を追加することができます。

于 2012-05-31T17:36:39.190 に答える
2

これはうまくいきます、試してみてください

// in the page load event
if(!this.IsPostBack)
   Button1.Text = test;

// in the Click event
this.Button1.Text += test;

現在のコードの問題は、インスタンス変数をボタンテキストに割り当てていることです。これはインスタンス変数であるため、同じ値でページをリクエストするたびに初期化されるため、 hihihihihihihi ではなく常に hihiのみを取得します。

ボタンをクリックするたびに、ASP.Net は を作成するnew Page()ため、testメンバーは常に次のように初期化されますtest = "hi";

于 2012-05-31T17:34:55.383 に答える