1

アイテムの名前と価格を入力するための 2 つのテキスト ボックス、その下の送信ボタン、およびその下の現在のアイテムを示す箇条書きリストがあります。送信ボタンをクリックすると、新しいアイテムがアイテムのリストに入力され、箇条書きのリストが新しいアイテムで更新されます。

ただし、箇条書きリストを生成するコードを OnInit に配置すると、最初のポストバックでリストが更新されません。それを Page_Load に入れると、ポストバックごとにリストが複製されます。どこに置くべきですか、何が間違っていますか?

これが私のコードです。

protected override void OnInit(EventArgs e)
{
    base.OnInit(e);

    List<Product> Products = (List<Product>)Session["Products"];
    foreach (Product p in Products)
    {
        ListItem productname = new ListItem();
        productname.Text = p.name;
        blProducts.Items.Add(productname);
    }

}

送信ボタンのコードは次のとおりです。

protected void btnSubmit_Click(object sender, EventArgs e)
{
    List<Product> Products = (List<Product>)Session["Products"];
    string name = txtName.Text;
    decimal price = decimal.Parse(txtPrice.Text);
    Product p = new Product(name, price);
    Products.Add(p);
    Session["Products"] = Products;
}
4

2 に答える 2

1

行う

Page.IsPostBack == false。

使用する:

page_load {
if(!Page.IsPostback)
  CalltheLoadFunction

}

on_click {
_adds the stuff.
CalltheLoadFunction() //again
}

CalltheLoadFunction() {
 dropdown.clear().
 dropdown.datasource = datasource
 dropddown.databind()
}

私はInitを使用しません。その関数で Page_load (ispostback false) を使用します。ボタンをクリックした後、データ更新関数を再度呼び出します。ページ読み込み関数の ispostback を常に確認する必要があります。再度読み込まれないように、false であることを確認してください。

于 2012-04-08T19:59:41.153 に答える
1

ボタンクリックのポストバックは初期化後に発生するため、イベントの順序は次のとおりです。

  1. 初期化により、製品のリスト項目が 1 つ追加されます
  2. ボタンのクリックが発生し、製品に追加されます。

新しいアイテムが追加される前に製品が列挙されるため、ページには反映されません。

Asp.Net ページのライフサイクルの概要

ポストバックを処理した後の最初のイベントであるため、init コードを prerender に移動できます。ViewStateに保存されているアイテムのリストを決してクリアしていないため、倍増している可能性があるため、initが呼び出されるたびに(すべてのリクエスト)、すべてをProducts再度追加しています。そのセクションを でラップしてif(!Page.IsPostBack)、ボタンのクリックでリストとセッションに直接追加することもできますが、追加コードを複製するよりもロジックを修正する方がよいでしょう。

于 2012-04-08T19:52:32.103 に答える