2009-08-21 13 views
8

に価値を失います。ASP.NETプライベートメンバフィールドには、次のコードを考えてみましょうポストバック

なぜですか?

秘密は何ですか?

+1

コードは書かれているように機能していると言っていますが、ユーザー名をプライベート変数に変更すると失敗しますか? –

+0

nullまたはstring.Emptyに初期化されていますか? – Martin

+0

@Martin、それはnullです。 – anonymous

答えて

15

ASP.NETはステートレスであるため、ポストバックからポストバックに状態を保持しないためです。ユーザーをビューステート、セッション、またはアプリケーションに保存して、ポストバック時にポストバック時にそれを確認します。

#region UserName 
public string UserName 
{ 
    get 
    { 
     if (this.ViewState["UserName"] == null) 
      return string.Empty; 

     return (string)this.ViewState["UserName"]; 
    } 
    set { this.ViewState["UserName"] = value; } 
} 
#endregion 
+0

しかし、彼は 'username =(string)Request.QueryString [" username "];'をすべてのページの読み込みでやっています。 – Kobi

+0

@David Basarab、私は解決策を要求していません。私は効果の違いを知ろうとしています。この場合、保護された対プライベート。 – anonymous

5

あなたも、ボタンのクリックイベントのような「シンプル」なもののために、任意のポストバックを行うたびに、あなたはページクラスの新しいインスタンスで作業しています。これはASP.Netです。101.

+0

新しいページにリダイレクトするか、新しいクエリ文字列を含むページを読み込むと、それはポストバックではありません。クエリ文字列を含むページ上でボタンクリックイベントを処理すると、それはポストバックであり、クエリ文字列はポストバックhttp要求とともに送信されます。いずれにせよ、それはまだページクラスの新しいインスタンスです。 –

+0

保護されたものと個人的なものとの関連について私の答えは見つかりませんでした。 – anonymous

1

usernameフィールドをprivateまたはprotectedとして宣言しても、このような状況には関係ありません。 protected/privateだけのベアリングは、クラス外の変数や継承されたメンバーへのアクセシビリティです。

これはライフサイクルの問題と思われます。

初めてこのページに移動すると、要求にクエリ文字列が設定されている場合、ユーザー名には値が設定されます。したがって、 "/TeacherControlPanel.aspx"には値のないユーザー名がありますが、 "/TeacherControlPanel.aspx?username=SomeUserName"になります。このような場合、フィールドusernameは、設定されている場合にのみ値を持ちます。クエリーストリングが設定されていない場合、ページがボタンのクリックイベントを処理すると、負荷が発生します。クエリ文字列が設定されていない場合、ユーザー名はnullになります。つまり、clickイベントにリダイレクト文字列を追加する必要はありません。

あなたのアプリケーションでは、どのナビゲーションパスがTeacherControlPanel.aspxにアクセスするのですか?

+2

さらに、プライベートフィールドは表示されませんが、保護されたフィールドはページ(TeacherControlPanel.aspx、<% %>ステートメント)に表示されます。 – Kobi

関連する問題