1

我有两个用于输入商品名称和价格的文本框,下方有一个提交按钮,下方有一个显示当前商品的项目符号列表。单击提交按钮时,应在项目列表中输入新项目,并用新项目刷新项目符号列表。

但是发生的情况是,如果我将生成项目符号列表的代码放在 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

buttonclick 的回发发生在 init 之后,因此您的事件顺序是:

  1. 初始化为产品添加 1 个列表项
  2. 发生按钮单击,添加到产品。

由于产品是在添加新项目之前枚举的,因此它不会反映在您的页面上。

Asp.Net 页面生命周期概述

您可以将初始化代码移动到预渲染,因为这是处理回发后的第一个事件。它可能会加倍,因为您永远不会清除该项目列表,我相信这些项目列表存储在 ViewState 中,因此每次调用 init(每个请求)时,您都会Products再次添加所有内容。您也可以将该部分包装在 an 中if(!Page.IsPostBack)并直接添加到列表和单击按钮中的会话,但修复逻辑可能比复制添加代码更好。

于 2012-04-08T19:52:32.103 回答
1

Page.IsPostBack == 假。

采用:

page_load {
if(!Page.IsPostback)
  CalltheLoadFunction

}

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

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

I wouldn't use Init. I use Page_load (ispostback false) in that function. After the button click, call the refresh data function again. You should check ispostback on the page load function all the time. Make sure it is false so that it doesn't load again.

于 2012-04-08T19:59:41.153 回答