我正在尝试创建一个网页,该网页将基于下拉列表的选定值显示适当的用户控件。

基本上页面布局是这样的:

下拉选择
<根据下拉选择创建的用户控件>

我有一半的工作......这些控件时更改选择的变化。
在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/

10-12 00:23
查看更多