我最近在使用向其中添加动态控件的中继器时遇到了一个问题,虽然我有一个解决方法,它在功能上完全符合我的要求,但我想知道是否有更好的方法就我的理解而言,这样做的方法。我使用 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/