【问题标题】:Best Way to Postback Dynamic Table回发动态表的最佳方式
【发布时间】:2013-11-07 20:47:44
【问题描述】:

我有一个服务器端表格控件。因为我事先不知道它会有多少行和列,所以我在我的页面Form_Load 事件处理程序中构建了这个表的内容。

效果很好。但是我正在用文本框填充同一个表格,如果单击提交按钮,我需要能够读取这些文本框。

目前看来,表内容在回发时已被清除。

在表格中动态创建文本框,然后在回发页面时读取这些文本框的值的最佳方法是什么?

【问题讨论】:

  • 您必须最迟在Page_Load 中重新创建所有动态创建的控件,并使用相同的 ID。是否有理由不使用像 GridView(renders as table) 或 Repeater 这样的 Web 数据绑定控件?
  • 但是如果我重新创建表格,那么文本框不会被重置并丢失编辑的值吗?我喜欢中继器控制,但这似乎会带来同样的问题。我仍然需要能够读取编辑后的值。
  • 否,值将从ViewState 加载,如果您分配相同的 ID 并且不要在页面生命周期的后期重新创建控件,则会成功触发事件。
  • @TimSchmelter:好吧,你失去了我。如果它在 ViewState 中,为什么我需要重新创建所有动态创建的控件?无论如何,我创建表格内容的代码设置了文本框的值。因此,如果我在回发时这样做,这些值将不代表用户键入的内容。您知道任何可以解释您的建议的链接吗?
  • 看看 msdn,例如根据页面的生命周期:msdn.microsoft.com/en-us/library/ms178472.ASPX,这也值得一读:dynamic controls(也是关于ViewState的第一个链接)。

标签: asp.net webforms postback


【解决方案1】:

如果您想在回发时保留这些值,您需要在 Page_Init 事件上重新创建表控件层次结构。这通常意味着您需要将表控件重新绑定到来自数据库的数据结构。

一旦控制层次结构就位,ASP.NET 将从ViewState 加载任何数据。该数据实际上可以是先前从服务器在文本框上设置的数据。此步骤将确保这些值保留在控件上。

在下一步中,ASP.NET 将处理 POST 数据,这里基本上将使用来自客户端(浏览器)的输入来更新表格文本框。从 ViewState 设置的任何值都将(很可能)被覆盖。

所有这些都发生在Page_Load 之前,所以在这个阶段你应该能够访问客户端文本框的值。

查看ASP.NET Page Life Cycle,尤其是this 图片。

【讨论】:

  • 我没有将我的表直接连接到数据库。但是您是说我可以填充表格,包括设置这些文本框的值,而 ASP.NET 会用回发的数据覆盖这些值吗?我正在测试那个。抱歉,我对页面生命周期很满意。没有看到这如何回答我想弄清楚的问题。
  • 这里的关键应该是在Page_Init重构控制层次。然后 ASP.NET 应该足够聪明,可以将 Request.Form 对象中的值映射到原始 ASP 表。至少我希望如此:)
  • 仍在测试中。实际上,即使我在Page_Load 中构造控件,它似乎也符合我的理解。此外,这是在 ASCX 控件中,它的外观受属性的影响。所以在设置这些属性之前我无法构造控件
  • 所以您是说在 Page_Load 中浏览器中的值在重建表后立即可用?那会有点奇怪。关于您的 ASCX:您是否还使用 LoadControl 动态加载它?在这种情况下,ASCX 的加载也应该在 Page_Init 事件中完成。
  • 我是说我可以在Page_Load 中填充表格,然后我可以在按钮的 Click 处理程序中读取用户输入的值。控件不是动态加载的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-01
相关资源
最近更新 更多