ASP.NET:添加控件动态地在发布后返回不同的数据
本文关键字:返回 数据 NET 添加 控件 动态 ASP | 更新日期: 2023-09-27 18:29:01
我得到了一个页面,管理员可以在其中编辑我从flickr中提取的一些照片,因此所有控件都是动态添加的。
我有一些控件添加到面板,然后将面板添加到Form.controls。他们持有的所有数据都来自flickr。
我的问题是,在发布后,列表更改和控件正在加载,但文本框在发布前保持相同的数据,即使我每次都从flickr获得数据。
对我来说,如果我用更少的文本框来做这件事,每件事都会很好。这个列表大约有10多张图片,这个数字将来可能会改变。
(很抱歉代码太乱,我对编程很陌生)这是代码:
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
RadioButtonList1.AutoPostBack = true;
selectedSetID = getSelectedSetId(RadioButtonList1.SelectedItem.Text);
photoSet = new MyPhotoSet(selectedSetID);
photo = new FlickerImages[photoSet.Count];
for (int j = 0; j < photo.Length; j++)
{
photo[j] = new FlickerImages(photoSet.MediumURLS[j], photoSet.ThumbnailURLS[j], photoSet.Titles[j], photoSet.Descreption[j], photoSet.PhotosID[j]);
panel = photo[j].GetPanelWithEditControls(j);
button = new Button();
button.ID = "sendDataButton" + j;
button.Text = "send data";
button.Click += button_Click;
panel.Controls.Add(button);
Form.Controls.Add(panel);
}
}
else
{
//here is the post back,
every thing load fine.
adding and removing the controls but if the textbox's load in the same place, it hold the same data befor the post back.
RadioButtonList1.AutoPostBack = true;
selectedSetID = getSelectedSetId(RadioButtonList1.SelectedItem.Text);
photoSet = new MyPhotoSet(selectedSetID);
photo = new FlickerImages[photoSet.Count];
for (int i = 0; i < photo.Length; i++)
{
photo[i] = new FlickerImages(photoSet.MediumURLS[i], photoSet.ThumbnailURLS[i], photoSet.Titles[i], photoSet.Descreption[i], photoSet.PhotosID[i]);
panel = photo[i].GetPanelWithEditControls(i);
button = new Button();
button.ID = "sendDataButton" + i;
button.Text = "send data";
button.Click += button_Click;
panel.Controls.Add(button);
Form.Controls.Add(panel);
}
}
}
(对不起我的英语)
不要将控件生成放在Page_Load中,而是将其放在Page_Init中。
既然您提到您对ASP.NET还很陌生,我强烈建议您阅读页面生命周期。
作为一名ASP.NET开发人员,了解某些事情是如何以及何时在服务器上发生的,这一点非常重要,从服务器接收到对aspx页面的请求到浏览器输出页面以进行渲染。
为什么我建议将代码放在Page_Init中,简短的解释是运行时如何处理动态创建的控件和Viewstate。Viewstate包含web应用程序的用户所做的任何更改。在页面生命周期中,您会注意到Viewstate值的应用发生在page_Load之前,但发生在page_Init之后。
这意味着,如果您的代码在Page_Load中,那么控件将从Viewstate生成,并根据用户输入的内容进行更新,但您自己在Page_Load的代码将使用默认值重新生成这些控件。此事件之后不会发生任何可以重新加载用户输入的事情。
(希望这是有道理的。如果没有,我链接的页面可能会更好地解释它。)
这里还有另一篇文章从不同的角度阐述了这个主题,但仍然对你很有帮助。
这里有超短版。
最后,(把最好的留到最后)在这里可以找到关于这个主题的最全面的文章之一,用通俗的英语解释事情。