【问题标题】:Why is my view state not storing a dynamic control adding using Controls.Add?为什么我的视图状态不存储使用 Controls.Add 添加的动态控件?
【发布时间】:2010-12-03 06:46:18
【问题描述】:

我正在尝试根据从下拉列表中选择的类别 ID 加载控件。

这是我在 switch 语句中显示用户控件的代码。这是我知道这样做并拥有可重用视图的唯一方法。我对其他方法持开放态度,因为我读过一些人说要避免动态加载?

var control =  Page.LoadControl("~/usercontrols/aCertainForm.ascx");
exampleDivArea.Controls.Add(control);

目前它在调用上述代码的按钮单击时加载良好,但是当我再次回发到同一个表单时,它会失去动态控件的状态。

提前感谢您的回答,我很感激,希望很快我就能为他人提供更多帮助:)

【问题讨论】:

    标签: c# asp.net controls postback viewstate


    【解决方案1】:

    上面的代码需要在页面生命周期的早期运行,这样 ASP.NET 才能恢复它的状态。下拉列表更改事件的服务器端事件处理程序在所有状态恢复后发生,因此为时已晚。您必须将代码添加到 Init 或类似的地方。

    (是的,这很丑陋,并且真的破坏了整个 ASP.NET 抽象,就像许多事情一样。抱歉 :-)

    【讨论】:

    • 目前下拉菜单不会自动回发,但它下方的按钮会更改多视图视图
    • 好的,那么该按钮事件处理程序需要具有不仅更改多视图(针对该请求)而且还存储一些 ViewState 的代码,该视图状态也在页面生命周期的早期读取以设置多视图。
    【解决方案2】:

    加载控件后,为其分配 id。此代码必须在初始显示和回发时运行。并确保使用的 id 相同。

    这是我将在 Page_Load 中使用的代码:

    var control =  Page.LoadControl("~/usercontrols/aCertainForm.ascx");
    control.id = "ACertainFormControl01";
    exampleDivArea.Controls.Add(control);
    
    if (IsPostBack)
    {
        do stuff
    }
    else
    {
        do stuff
    }
    

    【讨论】:

      猜你喜欢
      • 2014-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多