c# - 中继器内动态控件的 View 状态问题

标签 c# asp.net

我最近在使用向其中添加动态控件的中继器时遇到了一个问题,虽然我有一个解决方法,它在功能上完全符合我的要求,但我想知道是否有更好的方法就我的理解而言,这样做的方法。我使用 ASP.NET 已经有大约 6 个月了,每次我认为我已经完全了解页面生命周期/ View 状态时,都会突然出现一些我无法回答的问题。

我正在创建一个表单,用户可以在其中注册他们对事件的兴趣,并为多人注册。

aspx 是这样的:

<asp:Repeater ...>
    <bunch of formatting and always there controls like firstname/lastname/address>
    <asp:PlaceHolder ...>
        <dynamic controls for workshop selection go here>
    </asp:PlaceHolder>
</asp:Repeater>

事件可以有用户可以注册的研讨会,研讨会的可用性取决于他们选择参加事件的日期。研讨会的可用性取决于日期,因此他们在选择日期之前无法选择研讨会。

无论如何,我添加的动态控件基本上是一堆文字和一堆单选按钮组。

我首先在 ItemDataBound 事件处理程序中添加控件,但是当将我的转发器项目保存回我的委托(delegate)列表时,单选按钮的 ViewState 从未更新。 ItemTemplate 中引用的所有字段都得到了很好的处理,但我动态添加的单选按钮却没有。

我尝试改用 ItemCreated 事件,在那里添加我的按钮,但这似乎没有任何区别。最后我确定了一个基于 this 的解决方法.基本上,我只是以文字形式输出 HTML 输入字段,然后从请求中读回它们。

现在一切正常,我对功能很满意,必须直接将单选按钮输出为 HTML 输入而不是使用服务器端控件似乎真的很脏。有没有人知道为什么 ViewState 没有被正确恢复?

需要说明的是,控件每次都以相同的顺序重新创建,并正确设置了 ID。我到处都在使用动态控件,它们工作正常,但在这种情况下,当我将它们添加到中继器中时,我无法让它们工作。

//更多说明

我无法在 Page.Init 中创建这些控件,因为用户选择了导致回发的日期,我必须等待该控件的 View 状态加载后才能创建动态控件。

最佳答案

当转发器绑定(bind)到它的数据源时,您正在创建(或重新创建)控件。如果在页面加载 ViewState 之后发生这种情况,则 ViewState 将不可用于动态创建的控件。

检查是否足够早地绑定(bind)转发器 - Page.Init 正常; Page.Load 太晚了。

关于c# - 中继器内动态控件的 View 状态问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/575414/

相关文章:

c# - SQL Server CE 回滚不会撤消删除

c# - 局部变量上的冲突线程

.net - 如何防止在 ASP.NET/IIS 环境中直接调用 URL?

asp.net - 当用户单击浏览器的后退按钮时防止回发

C#:有什么工具可以自动从类生成接口(interface)?

c# - 如何将对象时间戳与对象 ID 连接起来并将它们传递给操作方法

c# - NAudio 录音中不需要的静音部分

c# - 我们可以在 ASP.NET MVC 应用程序中更改操作方法名称吗?

c# - 在 C# 中创建 VPN 客户端

c# - 如何编写一个事务来涵盖移动文件和在数据库中插入记录?