【问题标题】:Rebinding Repeater in an event loses its ViewState on its controls在事件中重新绑定中继器在其控件上丢失其 ViewState
【发布时间】:2013-11-21 05:07:54
【问题描述】:

我的页面中有一个转发器,其中包含一些先决条件,例如复选框列表和列表框,它们指示转发器的数据源带回的内容。单击一个按钮,它将对工作正常的中继器进行数据绑定。但是,如果用户决定要添加其他内容或删除某些内容,他们可以选中/取消选中某些字段,然后再次点击按钮,这将重新绑定转发器并更改显示的内容,但是转发器中所有当前控件的视图状态会丢失。

在初始化事件中绑定转发器是不可能的,因为复选框列表/列表框值的 ViewState 在页面生命周期的那个时刻不可用,并且需要这些值才能作为参数传递到我的数据源中中继器。

我有哪些选项可以保持中继器控件的状态?

【问题讨论】:

    标签: c# asp.net repeater viewstate


    【解决方案1】:

    转发器控件绑定完全重新创建转发器模板内的所有子控件。因为新的 DataBind 结果可能(或可能不)在转发器内包含极其不同的数据。 您希望在中继器内部维护什么样的控件及其状态?也许使用序号 html 控件并通过 Request.Form 集合操作它们会是更好的方法?

    如果你想在应用新的数据绑定之前从转发器中保存数据,最好的地方是 Page.PreRender 事件。在这种情况下,所有 Page 控件都已重新创建,并且它们的视图状态已恢复。因此,您可以通过 Repeater.Items 集合进行迭代并逐行保存来自转发器的数据。保存所有数据后,您可以根据页面中的当前过滤器值重新绑定转发器控件。

    【讨论】:

    • 这是截图:imgur.com/4y6rb8m 它们基本上都是文本框,几行在图像中不可见的更下方的列中有下拉列表。但我会注意到有一个嵌套中继器。每个父中继器行(例如“Visa”)都有一个内部中继器,它显示多个子行。但我只需要维护这些文本框的值。
    • 好的,你想如何关联旧的文本框/DDL,与表单提交一起返回,在转发器重新绑定后创建?或者您想先处理转发器中的数据更改,然后重新绑定它?
    • 我只是想确保新创建的中继器中仍然存在的任何组在文本框中仍然具有它们的值。有很多字段供用户输入,因此如果中途他们意识到他们忘记包含其中一个组,或者他们决定不需要一个组,他们希望能够选中/取消选中其中一个框,然后重新生成转发器,但他们不想失去所有这些价值而不得不重新开始。
    • 好的,让我们想象一下简单的情况。例如,在加载您的转发器后,有 5 个项目和 5 个文本框。用户已经填写了这些文本框并进行了一些过滤器更改,之后您的转发器实际上还有 2 个其他项目。那么你打算如何处理这个问题?也许更好的方法是在每次回发和数据绑定之后保存来自 Repater 的所有数据?
    • 在应用过滤器之前,我会添加说明您可以在何处以及如何保存转发器中的数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多