5

ユーザー名とパスワードを検証した後に true に割り当てる CheckBoxActivated というブール変数があります。

string name = us.UserName;
string password = us.Password;

if (name.Equals(txtName.Text) && (password.Equals(txtPassword.Text)))
{
    CheckBoxAvtivated = true;

奇妙なことに、変数に「true」を割り当てた後、別のボタンをクリックするとすぐに「false」になり、望ましくない動作が発生します。

protected void butNext_Click(object sender, EventArgs e)
{
    if (CheckBoxAvtivated)
    {
        pnlCheckBoxes.Visible = true;
        pnlUserCheckBoxValidation.Visible = false;
    }
    else
    {
        pnlCheckBoxes.Visible = false;
        pnlUserCheckBoxValidation.Visible = true;
    }

したがって、変数の状態は予期せず false に変わります。これが起こる理由は何ですか?

4

1 に答える 1

21

asp.net のクラス レベル変数 (グローバル変数) は、ポストバック間で状態を維持する場合は、ビューステートを使用する必要があるポストバック間で状態を維持しません。 Asp.netプロトコルに基づいてhttpいる ステートレス プロトコルであり、要求間でユーザーのデータを保存する手段を提供しない

ビューステートに設定するには

ViewState["CheckBoxAvtivated"] = "true";

ビューステートから取得するには

bool CheckBoxAvtivated = bool.Parse(ViewState["CheckBoxAvtivated"].ToString());

ビューステートを使用する方法と、使用すべきでない場所を学ぶことが重要です。

ビューステートの役割

ビュー ステートの本来の目的は単純です。ポストバック間で状態を保持するためです。(ASP.NET Web ページの場合、その状態は、そのコントロール階層を構成するコントロールのプロパティ値です。) これは、「どのような種類の状態を永続化する必要があるか?」という疑問を生じさせます。その質問に答えるために、ポストバック間で永続化する必要のない状態を調べることから始めましょう。ページ ライフ サイクルのインスタンス化段階で、コントロール階層が作成され、宣言構文で指定されたプロパティが割り当てられることを思い出してください。これらの宣言型プロパティは、コントロール階層が構築されるときにポストバックごとに自動的に再割り当てされるため、これらのプロパティ値をビュー ステートに保存する必要はありません。

ステートレス プロトコル

コンピューティングでは、ステートレス プロトコルは、通信が要求と応答の独立したペアで構成されるように、各要求を以前の要求とは無関係の独立したトランザクションとして扱う通信プロトコルです。ステートレス プロトコルでは、サーバーは、複数の要求の間、各通信パートナーに関するセッション情報またはステータスを保持する必要がありません。対照的に、内部状態の保持を必要とするプロトコルは、ステートフル プロトコルとして知られています。ステートレスの詳細については、このウィキペディアの記事を参照してください

于 2013-01-31T06:07:09.643 に答える