【问题标题】:Dynamically Loading Controls and Persistence in ASP.NET在 ASP.NET 中动态加载控件和持久性
【发布时间】:2011-04-06 22:18:15
【问题描述】:

我正在 Page_Load 事件中加载一系列控件。但是,我必须在每次页面加载时重新创建这些控件,这意味着将它们的数据存储在其他地方。这很麻烦。

protected void Page_Load(object sender, EventArgs e)
{
   MyControl control = (MyControl)LoadControl(...);
   control.Initialize(GlobalClass.controlData);
   //^gives the control the data it had previously.  
   //Or use ViewState["controlData"] if serializable.
   Controls.Add(control);
}

我觉得我应该使用if (!IsPostBack) {},但我不知道如何使用,也不知道为什么。

相比之下,如果我将控件放入标记中,那么控件似乎会保持持久性。例如,标记中的按钮会记住对其 Text 属性的任何更改(我认为?)。

<asp:Button ID="buttonText" runat="server" 
            Text="Text Segment" onclick="buttonText_Click" />

如何通过动态添加的控件(例如通过标记添加的控件)保持某种持久性?这将节省我很多工作和挫败感。

谢谢。

(我已经编写了一小段代码,但是我越是使用 ASP.NET,我就越感到困惑。这与我对学习工作的理解完全相反 :-P。)

【问题讨论】:

    标签: asp.net dynamic controls persistence loadcontrol


    【解决方案1】:

    我明白你的意思。是的,这很麻烦,但这就是无状态技术的工作原理。

    没有办法实现与静态控件(您放入 HTML 标记中的那些)相同的行为。

    按照我在这个答案中给出的提示:

    Accessing controls created dynamically (c#)

    【讨论】:

      【解决方案2】:

      对于动态加载的控件,如果您在 Page_Init 事件期间加载它们,则可以将它们添加到 ViewState 中,它们将能够保留从 PostBack 到 PostBack 的状态。

      【讨论】:

      • 您的意思不是添加控件本身,您的意思是添加控件的各种属性,对吗?我已经尝试添加控件本身(比添加所有必要的属性更快:-P),并且控件不可序列化。
      • @Yerg - 如果内存可用(而且我还没有查看它来验证它),只需通过在 Page_Init 中的控件上设置 EnableViewState = true; 将其排队到 ViewState 中。您无需手动添加任何内容。
      • 我已经反射了文本框控件,它总是将我记得的东西保存在 ViewState 中。我很好奇 EnableViewState 到底做了什么...无论哪种方式,保存动态添加的控件列表的唯一方法是将控件与其数据分开,并根据数据实例的数量,在页面加载时产生那么多具有该数据的控件的实例。还有其他想法吗?
      猜你喜欢
      • 2011-08-13
      • 2015-02-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-31
      相关资源
      最近更新 更多