我正在尝试创建一个网页,该网页将基于下拉列表的选定值显示适当的用户控件。
基本上页面布局是这样的:
下拉选择
<根据下拉选择创建的用户控件>
我有一半的工作......这些控件时更改选择的变化。
在OnInit()中,我动态创建了最后一个选定的控件(其值被保存在 session 状态中,因为OnInit上不提供ViewState)。
发生下拉选择更改时,我删除了旧的用户控件,并添加了一个新的控件。 问题是:随着从选择更改事件中添加了新控件,我无法在第一个回发上保存用户的更改。在第一个回发之后,从OnInit(而不是Change事件)创建所选控件,然后从此状态开始保存状态,直到下一个选择更改为止。
这是SelectionChanged方法:
protected void SelectionChanged(object sender, EventArgs e)
{
SelectedValue = int.Parse(DropDownList.SelectedValue); //Store in Session
Control userControl = GetSpecificUserControl(SelectedValue);
PlaceHolder1.Controls.Clear(); // Remove old user control
PlaceHolder1.Controls.Add(userControl);
}
在发生SelectionChanged之后,用户对新控件所做的任何更改都不会保存在以下回发中。但是,以后的回发确实可以保存。此时,将在OnInit()中创建控件。
有什么方法可以在控件更改时强制返回正确的帖子和ViewState?更改控件后是否可以强制页面重新初始化?
最佳答案
这是ASP.Net Webforms的经典“烦恼”问题。您有几种选择:
1)这有点麻烦,因为它超出了预期的页面生命周期,但是以我的经验,这是处理问题的最直接方法。当页面从下拉选择事件发回时,只需在Request["MyDropDownID"]
期间轮询Init()
以获得下拉控件的选定值-不要等待OnMyDropDownChanged()
事件设置您的页面。
2)为您的用户控件实现自己的ViewState处理。这需要深入研究ViewState文档并覆盖许多方法。
3)乔尔的解决方案。他击败了我,但我试图获得第一篇帖子:p
其他选项涉及使用javascript等发布值,但是这些值会变得非常困惑。
关于asp.net - 在ASP.Net中动态更改用户控件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/987680/