2016-04-14 13 views
0

ユーザー情報(ADのチェック、電子メールの識別名、説明フィールドのロードなど)に基づいて変数を設定するクラスがあります。 。私は_Defaultページで 'currentinfo'変数を宣言していますので、セッション中にオブジェクトを持つことができます。ASP.NET:_Defaultで宣言され、Page_Load()でインスタンス化されたオブジェクトが2番目のロード時にNULLです

Page_Loadイベントでクラスをインスタンス化しますが、If(!IsPostBack)の内部でクラスをインスタンス化するので、コンストラクターメソッドは最初だけ実行されます。それは正常に動作します(コンストラクタはオブジェクトを生成し、すべてのデータはブレークポイント付きのデバッグモードで確認されたものです)。しかし、If句を離れると、オブジェクトは再びnullになります。

ページが読み込まれたときにオブジェクトを準備しておき、ボタンのクリックなどの他のイベントで使用できるようにしたいとしました。だから、私の質問は次のとおりです:

1 - 私はコンストラクタが終了するのに時間がかかるので、私はボタンをクリックするたびにページを再度ロードし、オブジェクトがインスタンス化されていると、if(!IsPostBack) if節の中ではないので、新しいイベントが発生するたびにASP.NETがページを再読み込みするのを止めるにはどうすればよいですか?

2 - 1ができない場合は、句を残した後でオブジェクトを有効に保つにはどうすればよいですか? 編集:2 - 2回目のページの読み込み後に変数の状態を保持するにはどうすればよいですか?

public partial class ListUsers: System.Web.UI.Page 
    { 
     CurrentUserStructure currentuserinfo; 
     List<CurrentUserStructure.ListUserClass> lsUsers; 

     protected void Page_Load(object sender, EventArgs e) 
     { 
      if (!IsPostBack) 
      { 
       currentuserinfo = new CurrentUserStructure(); 
       lsUsers = currentuserinfo.GetUserList(); 
      } 
     } 

答えて

0
  1. あなたはサーバー側のコントロールを使用する場合は、Postbackは常に発生するであろう。したがって、新しいイベントが発生するたびにASP.NETがページをリロードするのを止めることはできません。ただし、IsPostbackプロパティを使用すると、ページが最初に読み込まれたときに変数がロードされ、その後の要求で初期化コードが実行されないようにすることができます。

  2. 可変状態を保持するには、変数をSessionまたはPage ViewStateに格納します。

次のコードでは、プロパティーListOfUsersを追加してセッションに格納しました。値はページロード時に最初に設定され、その後、プロパティから値を読み取ることができます。

public partial class ListUsers : System.Web.UI.Page 
    { 
    // the object is declared here. 
    // I understand it should be valid even if the page loads again 
    CurrentUserStructure currentuserinfo = new CurrentUserStructure(); 

    private List<CurrentUserStructure.ListUserClass> ListOfUsers 
    { 
     get { 
       return Session["CurrentNamespace.ListOfUsers"] ?? new List<CurrentUserStructure.ListUserClass>(); 
      } 
     set { 
       Session["CurrentNamespace.ListOfUsers"] = value; 
      } 
    } 



    protected void Page_Load(object sender, EventArgs e) 
    { 
     // everything from here on should happen only 
     // the first time the page is loaded 
     if (!IsPostBack) 
     { 
      // bellow the lsUser object is constructed 
      this.ListOfUsers = currentuserinfo.GetUserList(); 
     } // up to here the lsUsers object is available 
} 
0

は、私はあなたがリスト

protected void Page_Load(object sender, EventArgs e) 
    { 


     if (!IsPostBack) 
     { 

      List<User> listUser = new List<User>(); 
      listUser.Add(new User() { Name = "U1" }); 
      listUser.Add(new User() { Name = "U2" }); 
      listUser.Add(new User() { Name = "U3" }); 

      ViewState["listUser"] = listUser; 
     } 
    } 

    protected void Button_Click(object sender, EventArgs e) 
    { 
     var list = ViewState["listUser"]; //you can get the List from the ViewState 
    } 

を保存するためにビューステート必要があると思いますし、(How to: Save Values in Session Stateを参照してください)あなたはSessionアイテムコレクションにセッションデータを格納する必要があり

/// <summary> 
/// you need Serializable the class so that you can save it in ViewState 
/// </summary> 
[Serializable] 
public class User 
{ 
    public string Name { get; set; } 
} 
0

あなたのクラスSerializableを必要とします。むしろページよりも、Global.asaxファイルにSession_Start eventであなたのCurrentUserStructureクラスのインスタンスを作成します。

private void Session_OnStart(object sender, EventArgs e) 
{ 
    HttpContext sessionContext = HttpContext.Current; 

    // Create a new instance and store it for future use 
    CurrentUserStructure newInstance = new CurrentUserStructure(); 
    sessionContext.Session["currentuserinfo"] = newInstance; 
} 

次に、あなたのListUsersページでは、セッションストアから値を読み込みますプロパティを追加。あなたの2番目の質問については

public partial class ListUsers : System.Web.UI.Page{ 
    private CurrentUserStructure UserInfo 
    { 
     get 
     { 
      // Read the object from session store 
      return (CurrentUserStructure) HttpContext.Current.Session["currentuserinfo"]; 
     } 
    } 
} 

あなたがif句の外で利用できるようにするlsUsersが必要な場合、あなたは句の上にそれを宣言する必要があります。例:

List<CurrentUserStructure.ListUserClass> lsUsers = null; 
if (!IsPostBack) 
{ 
    lsUsers = currentuserinfo.GetUserList(); 
} 

しかし、論理を正しく実装すると、上記の内容は適切ではありません。あなたがリクエスト間GetUserList()の出力を保存したい場合は、オプションのカップルを持っている:

  1. 出力は複数のページで必要とされている場合は、セッションストアにそれを保存するために、おそらく最善です。これは、Session_OnStartイベントでも実行できます。
  2. 出力がこのページでのみ必要な場合は、出力をページのViewStateHow to: Save Values in View Stateを参照)に保存することができます。上記のオプション1の代替において

、そのCurrentUserStructureクラスインスタンス内のパブリックプロパティにGetUserList()の値を格納するために意味をなすことができます。たとえば:

protected void Page_Load(object sender, EventArgs e) 
    { 
     // No need to check if this request is a post-back, because the value is stored elsewhere and does not need to be re-queried every time 
     List<CurrentUserStructure.ListUserClass> lst = this.UserInfo.Users; 

     // Do stuff with lst ... 
    } 

public class CurrentUserStructure{ 
    private List<CurrentUserStructure.ListUserClass> users; 
    public List<CurrentUserStructure.ListUserClass> Users{ 
     get { 
       if(users==null){ 
        users = GetUserList(); 
       } 
       return users; 
      } 
    } 

    // Note that this method is now private 
    private List<CurrentUserStructure.ListUserClass> GetUserList() { 
     // Implement your logic here 
    } 
} 

このように、あなたは、セッションストアに格納されますCurrentUserStructure、からリストにアクセスできるようになります