none
postback问题 RRS feed

  • 问题

  • 禁止了viewstate,部分控件依然能保持状态,比如textbox,但dropdownlist就不能,即使在onload里重新绑定,也只会默认第一项选中。
    在网上搜了一下,如果在oninit事件绑定dropdownlist,那postback后,选择状态能保存。自己试了下,果然如此。
    为何会这样呢?

    2010年4月24日 13:05

答案

  • 你好,

    textbox实现了IPostbackDataHandler,它在loadpostbackdata方法中可以重新获取到前端传过来的value,这是禁用ViewState仍能保持原值的原因。

    dropdownlist也实现了这个接口,但是创建dropdownlist的控件层次需要用到数据源。而对于dropdownlist的数据来源有两个:viewstate和手动指定datasource。

    如果viewstate被禁止,那只能是手动设置datasource。

    手动设置有两种方式:一个是设置datasourceid,还有一个是如你所说的设置datatable等类似的东西。

    如果是设置datasourceid还是可以保存状态的,因为他实现了IPostbackDataHandler,理由和textbox一样。

    如你那样,在oninit中设置也是可以的。因为oninit方法在loadpostbackdata之前,但是在这个方法之后设置数据源则需要自己手动绑定。

    因为如果是在loadpostbackdata之后设置,此时又没有其它数据源,当dropdownlist在loadpostbackdata阶段设置选择值的时候,该dropdownlist没有任何item,也就是说没有创建控件层次,所以不可能有被选中项。

     


    Microsoft Online Community Support
    • 已标记为答案 ogra 2010年4月27日 5:36
    2010年4月26日 9:05

全部回复

  • 这个我也看过。不过有一点不明白,oninit是控件初始化,我在这事件中绑定dropdownlist,按理他只会默认选择第一项,但实际上在postback后,他能保存当前的选择状态。他怎么知道我在客户端选择了哪项呢?我的猜想是这样,viewstate是被禁止了,但依然有部分viewstate的数据被传送,这部分数据在oninit被接收处理,然后恢复控件状态?但我记得还原控件状态和赋值是在oninit之后的,好像是preload中进行的。

    2010年4月24日 22:10
  • 你好,

    textbox实现了IPostbackDataHandler,它在loadpostbackdata方法中可以重新获取到前端传过来的value,这是禁用ViewState仍能保持原值的原因。

    dropdownlist也实现了这个接口,但是创建dropdownlist的控件层次需要用到数据源。而对于dropdownlist的数据来源有两个:viewstate和手动指定datasource。

    如果viewstate被禁止,那只能是手动设置datasource。

    手动设置有两种方式:一个是设置datasourceid,还有一个是如你所说的设置datatable等类似的东西。

    如果是设置datasourceid还是可以保存状态的,因为他实现了IPostbackDataHandler,理由和textbox一样。

    如你那样,在oninit中设置也是可以的。因为oninit方法在loadpostbackdata之前,但是在这个方法之后设置数据源则需要自己手动绑定。

    因为如果是在loadpostbackdata之后设置,此时又没有其它数据源,当dropdownlist在loadpostbackdata阶段设置选择值的时候,该dropdownlist没有任何item,也就是说没有创建控件层次,所以不可能有被选中项。

     


    Microsoft Online Community Support
    • 已标记为答案 ogra 2010年4月27日 5:36
    2010年4月26日 9:05