转发器内动态控件的viewstate问题

时间:2009-02-22 18:36:57

标签: c# asp.net

我最近遇到了一个问题,当我使用转发器时我正在添加动态控件,尽管我有一个解决方法,功能完全符合我的要求,我想知道是否有更好的这样做是为了我的理解。我已经使用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的解决方法。基本上我只是在文字中输出HTML输入字段并从请求中读回来。

现在这一切都运行得很好,而且我对功能感到满意,直接输出单选按钮作为HTML输入而不是使用服务器端控件似乎很脏。有没有人知道为什么ViewState没有被正确恢复?

为了清楚起见,每次都以相同的顺序重新创建控件,并正确设置ID。我在整个地方使用动态控件并且它们工作正常,当我将它们添加到转发器中时,我无法让它们工作。

//更多澄清

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

2 个答案:

答案 0 :(得分:5)

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

检查你是否足够早地绑定你的转发器 - Page.Init没关系; Page.Load为时已晚。

答案 1 :(得分:0)

值得注意的是,Radiobuttons控件在转发器控件中不能“开箱即用”。 Repeater控件继承INamingContainer接口,确保所有呈现的html控件都具有唯一的名称属性。由于单选按钮使用name属性进行分组,这意味着您将无法创建单选按钮组,即设置GroupName属性将不具有所需的效果,因为Repeater将覆盖此并为每个RadioButton创建唯一的名称。