动态更改ASP.Net中的用户控件

gri*_*mus 10 asp.net dynamic-controls

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

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

下拉选择
< 基于下拉选择创建的用户控制 >

我有一半工作...当选择改变时控件正在改变.在OnInit()中,我动态创建最后选择的控件(其值以会话状态保存,因为ViewIn在OnInit中不可用).

当发生下拉选择更改时,我删除旧的用户控件,并添加一个新的用户控件. 问题是:从选择更改事件添加新控件后,我无法在第一次回发时保存用户的更改.在第一个回发后,从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);
}
Run Code Online (Sandbox Code Playgroud)

在SelectionChanged发生后,用户对新控件所做的任何更改都不会保存在以下帖子中.但是,随后的回发会得到保存.此时,控件将在OnInit()中创建.

当控件发生变化时,是否有某种方法可以强制正确的回发和ViewState?控件更改后是否可以强制页面重新初始化?

Joe*_*orn 10

您需要做的是在Session中保留DropDownList的最后一个已知值.然后:

是OnInit:

  • 创建会话中保存的值指示的任何控件

SelectionChanged事件

  • 删除在OnInit期间创建的任何内容
  • 根据新的DropDownList选择创建和添加新控件
  • 在会话中保存新的DropDownList选择

这样,在更改后的下一个回发中,您将重新创建ViewState期望找到的控件,因此将恢复其状态.

动态控件非常挑剔.通常,创建可能需要的所有控件并将其Visible属性设置为false更容易.这样它们根本不会呈现给浏览器.然后将Visible设置为true,以便在需要时只需要控件.

  • 这是因为尚未为新控件ID保存ViewState,并且ViewState不希望看到它.您需要在ViewState中注册您的控件 - 我建议我的解决方案#1,否则Joel建议添加所有控件并使其不可见.请记住,设置Visible = false意味着不呈现任何内容 - 因此,如果您拥有的控件数量可管理,这通常是一个很好的解决方案. (2认同)

wom*_*omp 5

这是ASP.Net webforms的经典撕裂问题.你有几个选择:

1)这有点像黑客,因为它超出了预期的页面生命周期,但根据我的经验,它是处理问题的最直接方式.当页面从下拉选择事件发回时,只需轮询Request["MyDropDownID"]下拉控件的选定值Init()- 不要等待OnMyDropDownChanged()事件设置页面.

2)为您的用户控件实现自己的ViewState处理.这需要深入研究ViewState文档并覆盖许多方法.

3)乔尔的解决方案.他打败了我,但我试图获得第一篇文章:p

其他选项涉及使用javascript等发布值,但那些变得非常混乱.