【问题标题】:collections in a UserControl losing contents on postbackUserControl 中的集合在回发时丢失内容
【发布时间】:2013-10-05 20:04:44
【问题描述】:

我在UserControl 中填充一个集合,然后从集合中创建动态LinkButton 控件。单击一个时,在回发时,集合为空。这种行为是设计使然,还是我可以做些什么来保持在回发时填充集合而不在代码中重新填充它们?需要在表单回发中重新查询吗?

【问题讨论】:

  • 所有变量都在页面生命周期结束时处理。这是设计使然,它的本质是stateless HTTP
  • 然而,在 ASP.NET 页面上定义的变量在回发时是完整的。什么机制对此负责?为什么用户控件会被区别对待?
  • @Metaphot:页面和UserControl 之间没有区别。也许你有一个不会被破坏的静态字段。但是我强烈建议不要在像 ASP.NET 这样的多线程环境中使用静态字段。
  • 声明为静态的控件将在回发时自动重新创建,动态创建的控件必须在回发时手动重新创建。

标签: c# asp.net user-controls dynamic-usercontrols


【解决方案1】:

在继承Web.UI.Page 的类中定义的每个变量都将在页面生命周期结束时销毁(包括控件和字段),因此如果您不重新初始化它,它将在回发时为null

在回发中持久保存它的一种方法是将其存储在 Session-variable 中。

您可以在此处找到有关如何跨回发持久化变量的所有选项的完整列表:http://msdn.microsoft.com/en-us/magazine/cc300437.aspx

  • 应用
  • Cookie
  • 表单发布/隐藏表单域
  • 查询字符串
  • 会话
  • ASP.NET 中的新状态容器
  • 缓存
  • 上下文
  • 视图状态
  • Web.config 和 Machine.config 文件 结论

HTTP 的本质是无状态

【讨论】:

  • 谢谢!缓存正是我需要的。
【解决方案2】:

您需要将信息保留在ViewState 中,并在回发后加载 ViewState 时重新创建控件。例如,您可以存储创建的按钮数量,然后重新创建它们。

https://stackoverflow.com/a/15497035/1711598查看类似的解决方案

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-08
    • 2013-04-12
    相关资源
    最近更新 更多