我有两个文本框,用于输入项目的名称和价格,下面的提交按钮以及显示当前项目的项目符号列表。 单击提交按钮时,应在项目列表中输入新项目,并使用新项目刷新项目符号列表。
但是,如果我将生成项目符号列表的代码放在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;
}
答案 0 :(得分:1)
按钮点击的回发在初始化后发生,因此您的事件顺序为:
由于在添加新项目之前枚举了产品,因此不会在页面上反映出来。
Asp.Net Page Lifecycle Overview
你可以将init代码移动到prerender,因为那是处理回发后的第一个事件。它可能会加倍,因为你永远不会清除那些项目列表,我相信它们存储在ViewState中,所以每次调用init(每个请求)时,你都会再次添加Products
。您也可以将该部分包装在if(!Page.IsPostBack)
中,并直接添加到列表中。单击按钮时的会话,但修复逻辑可能比复制添加代码更好。
答案 1 :(得分: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。确保它是假的,这样它就不会再次加载。