最近,我在使用要添加动态控件的中继器时遇到了一个问题,虽然我有一个解决方法,在功能上完全符合我想要的功能,但我想知道是否有更好的方法为了我的理解。我使用 ASP.NET 已经有大约 6 个月了,每次我认为我已经掌握了页面生命周期/视图状态时,就会突然出现一些我无法回答的问题。
我正在创建一个表单,用户可以在其中注册他们对某个活动的兴趣,并为多人注册。
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 事件处理程序中添加控件,但是当将中继器项目保存回委托列表时,单选按钮的 ViewState 从未更新。 ItemTemplate 中引用的所有字段都处理得很好,但我动态添加的单选按钮则不然。
我尝试改用 ItemCreated 事件,在其中添加按钮,但这似乎没有任何区别。最后我决定了一个基于的解决方法this http://groups.google.com/group/microsoft.public.dotnet.framework.aspnet/msg/f742774cac529b2c?pli=1。基本上我只是以文字形式输出 HTML 输入字段并从请求中读回它们。
现在一切都很完美,我对这个功能很满意,只是必须直接将单选按钮输出为 HTML 输入而不是使用服务器端控件,这看起来真的很脏。有谁知道为什么 ViewState 没有正确恢复?
需要明确的是,每次都以相同的顺序重新创建控件,并正确设置 ID。我在各处使用动态控件,它们工作正常,但在这种情况下,当我将它们添加到中继器中时,我无法让它们工作。
//更多说明
我无法在 Page.Init 中创建这些控件,因为用户选择导致回发的日期,并且在创建动态控件之前我必须等待该控件的视图状态加载。