【问题标题】:ViewState and client-side changesViewState 和客户端更改
【发布时间】:2010-06-29 11:09:42
【问题描述】:

我注意到一些控件(例如 TextBox)在回发之间保留它们的更改,即使更改是由客户端脚本进行的,而另一些则没有(例如 ListBox)。谁能解释我为什么?有没有办法将第一个行为扩展到其他控件? 谢谢!

【问题讨论】:

  • 这些不变的文本框是否被标记为ReadOnly

标签: c# asp.net javascript postback viewstate


【解决方案1】:

这取决于何时对 ListBox 进行数据绑定或填充 ListItem。

一般情况下,当 ListBox 在另一个父控件(如 Repeater)中创建,并且 Repeater 在 Page_Load 事件中是数据绑定时,就会发生这种情况。这意味着 ListBox 在 Page_Load 事件结束之前实际上并不存在。

ViewState 恢复到 ListBox 中的 Page_Init 和 Page_Load 事件之间的页面控件。如果 ListBox 的内容是在 Load 事件期间创建的,则意味着 ListBox 的 ViewState 在 PostBack 之后无法恢复内容,无法跟踪并自动从 PostBack 中选择新的 SelectedValue。

如果在这种情况下,Repeater 在 Page_Init 事件中是数据绑定的,则 ListBox 的内容将在 Page_Init 事件之后准备好,并且 ViewState 能够正确恢复并自动选择 SelectedValue。

我通常在 Page_Init 事件中对所有内容进行数据绑定,以确保控件能够正确使用 ViewState。

查看 ASP.NET Web 表单的页面生命周期了解更多详情。

http://msdn.microsoft.com/en-us/library/ms178472.aspx

【讨论】:

    【解决方案2】:

    所有控件在回发之间保持其更改 - 除非您以编程方式再次创建它们。

    您的 ListBox 可能会丢失更改,因为您在每个 PostBack 上填充它。

    试着去做

    if(!IsPostBack)
    {
     PopulateMyListBox()
    }
    

    【讨论】:

    • 抱歉,我没说清楚。当通过 Javascript 编辑控件时会出现奇怪的行为。如果我在客户端编辑文本框,则在回发后保留该值。另一方面,如果我编辑一个列表框(例如添加一个项目),则不会保留更改。我只是想知道为什么。
    • 查看状态 - 它跟踪您提供页面时的所有选项
    • @astorcas:您的评论比问题本身的措辞要好得多。可能有助于编辑您的问题文本。
    • @astorcas 文本框是发回你在他里面输入的内容,ether by javascript ether 手动。列表框是发回所选项目,而不是您在其上键入的内容,如果您通过 javascript 更改列表框的内容,则需要通过其他方式发送此更改以发回,因此您再次创建它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多