1

ここで起こっているライフサイクルを理解しようとしています。アイテムIDを取得してリストに書き込むaspリストビューがあります。

 protected void ShareWith_OnItemBound(object sender, ListViewItemEventArgs e)
    {
        if (!IsPostBack)
        {
            if (e.Item.ItemType == ListViewItemType.DataItem)
            {
                ListViewDataItem currentItemId = (ListViewDataItem)e.Item;
                System.Web.UI.WebControls.DataKey currentDataKey = this.lvShareWithPanel.DataKeys[currentItemId.DataItemIndex];
                int FriendId = Convert.ToInt32(currentDataKey["SharedUserId"]);
                CurrentList.Add(FriendId);
            }
        }
    }

私のリストがメソッドの外で定義されている場所

private List<int> CurrentList = new List<int>();

その後、ユーザーはいくつかの新しいアイテムをリストに追加し、asp ボタンをクリックして続行します。現在のリストと新しいリストの比較を実行していますが、ボタンのクリック後にデバッグを観察すると、リスト「CurrentList」が空になっていることがわかりました。メソッドの外側にあるリストが影響を受けるのはなぜですか?

理解を助けてくれてありがとう

4

4 に答える 4

3

リストには状態値がありません。そのため、ViewState、Session 状態、またはその他のいずれかでリストを保存する必要があります。

すべての ASP.NET ページは、ページの読み込み間で値を失い、状態から戻すか、毎回入力した場合にのみ値を取得します。ほとんどのコントロールは、ページ固有の ViewState に値を格納します。このリンクが役立ちます。

于 2012-10-08T09:28:47.193 に答える
2

ページのすべてのオブジェクトは、ページのライフサイクルの最後に破棄されます。そのため、ポストバックごとにリストを作成して入力する必要があります (または、Sessionお勧めしない場所に保存します)。

ページのPreRenderイベントを使用して、すべてのイベントが既にトリガーされていることを確認できます。

protected override void OnPreRender(EventArgs e)
{
    // why do you need a list as field variable at all? I assume a local variable is fine
    List<int> CurrentList = new List<int>();
    foreach(var currentItemId in lvShareWithPanel.Items)
    {
        System.Web.UI.WebControls.DataKey currentDataKey = lvShareWithPanel.DataKeys[currentItemId.DataItemIndex];
        int FriendId = Convert.ToInt32(currentDataKey["SharedUserId"]);
        CurrentList.Add(FriendId);
    }
    // do something with the list
}

static誰かがコメントしたようにしないでください。つまり、すべてのユーザーとすべてのリクエストに対して同じ「インスタンス」を使用することになります。

ここでは、すべてのイベントを確認できます。

ここに画像の説明を入力

于 2012-10-08T09:27:23.787 に答える
2

ASP.NET はステートレスであるため、ポストバック中にデータが失われます。CurrentListセッション/ビューステートなどで手動で追跡する必要があります。

public List<int> CurrentList
{
    get
    {
        return (List<int>)Session["CurrentList"] ?? new List<int>();
    }
    set
    {
        Session["CurrentList"] = value;
    }
}
于 2012-10-08T09:27:46.610 に答える
0

リストをViewStateに保存し、PageLoadイベントで、ViewStateに保存されているリストをクラスレベルのリストに割り当てることができます。これは、オブジェクトが破棄されるページライフサイクルが原因で発生します。

于 2012-10-08T09:30:06.327 に答える