【问题标题】:problem with viewstate of dynamic controls inside a repeater转发器内动态控件的视图状态问题
【发布时间】:2009-02-22 18:36:57
【问题描述】:

我最近在使用向其中添加动态控件的中继器时遇到了一个问题,虽然我有一个解决方法,它在功能上完全符合我的要求,但我想知道是否有更好的方法为我的理解做这件事的方法。我已经使用 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 中创建这些控件,因为用户选择了导致回发的日期,我必须等待该控件的视图状态加载后才能创建动态控件。

【问题讨论】:

  • 这能回答你的问题吗? Maintaining viewstate of a repeater
  • @MichaelFreidgeim 老实说,我已经很久没有处理我不知道的网络表单了!我已经多年没有在 .NET 中工作过,更不用说 Web 表单了。老实说,我现在对任何不得不使用网络表单的人的建议可能只是完全改变视图状态。
  • 很抱歉自动创建了无意的问题 - 评论应该是“Possible duplicate”
  • 啊 - 在这种情况下它没有,问题的流程不同,所以另一个问题的答案在这里没有帮助。

标签: c# asp.net


【解决方案1】:

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

检查您是否足够早地绑定中继器 - Page.Init 正常; Page.Load 为时已晚。

【讨论】:

  • 我无法在 Page.Init 中创建这些控件,因为用户选择了导致回发的日期,我必须等待该控件的视图状态加载后才能创建动态控件。除了Page_Load还不算晚,ASP.NET应该贯穿整个页面生命周期...
  • ... 添加新控件时。至少我认为这是应该的。我可以在 page_load 中添加动态控件并让它工作,只是当它们在中继器中时就不行了。
【解决方案2】:

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

【讨论】:

  • 是的,我知道,这就是为什么我可能不得不使用我的解决方法。我真的很想知道为什么我不能让视图状态工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-25
  • 1970-01-01
  • 2011-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多