自定义服务器控件(web)中的按钮回发后..

原型:

复合型自定义 web 服务器控件(继承自 CompositeControl),里面有动态生成的按钮,这些动态按钮有 click 事件。

 

现象:

click 一个动态按钮,或者 click 一个非动态按钮后,所有动态按钮不再支持点击(用的 linkbutton,生成的界面上 __dopostback 调用消失),部分 视图状态 被破坏;

 

原因:

CreateChildControls 函数 通过调用一个自定义的函数——setBtnState() 来产生这些动态按钮,而后,在各个按钮的 click 事件里需要改变各个按钮的状态(是否 enable),调用了 setBtnState 来完成这个动作。这个模型里,执行顺序是这样——

1、CreateChildControls,含 setBtnState,完成对 Controls 的更新 ; 2、click,含 setBtnState ;

注意,在 click 里直接调用 setBtnState 并没有导致更新 Controls,因此,执行最后的 Render 时实际写出的控件(根据动态控件缓存)和 Controls 里保存的控件就对不上了。这里,Controls 是超类的集合,由超类实现的 视图状态 就应该依据 Contols 的,因此,写在界面上的控件和 视图状态 对不上,导致界面上的按钮无效。

 

 

结论:

对服务器控件比较有效的调试手段是在类里使用用一个 string 在各个操作环节上做记录,然后在 Render 输出这个 string。

服务器控件似乎不太容易随时输出调试信息,而这样的记录就可以弄清各个环节的先后顺序,从而找到问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值