你犯过这三个常见的ASP.NET AJAX错误吗?

 

你犯过这三个常见的ASP.NET AJAX错误吗?

作者:Dave Ward

http://encosia.com/ 2007/10/24 /are-you-making-these-3-common-aspnet-ajax-mistakes/

有一点需要牢记:一次部分回传也就是一次回传。

UpdatePanel抽象AJAX功能的方法,隐藏在标准的Web表单方法学的后面,它提供给我们灵活性和易用性。然而,这也意味着使用UpdatePanel需要仔细注意ASP.NET页面生命周期。

在本篇文章中,我想指出一些开发者经常会碰到的问题,以及怎样才能避免它们:

l         页面事件在部分回传时照样会被触发

l         即使没有更新,UpdatePanel事件也会触发

l         控件事件处理器在Load事件之后触发

页面事件在部分回传时照样会被触发

ASP.NET AJAX新手经常忽略的一个事情是所有的页面生命周期事件(Page_Load, Page_PreRender, 等)在每次部分回传都会执行。在一次部分回传中,页面控件树会被完全重新实例化,并且每个控件都会经历它们自己的生命周期事件。如果不考虑这些问题,很容易陷入一些奇怪的陷阱之中。

在部分回传时,Page.IsPostBacktrue,有了它可以容易的避免这个陷阱。然而,就是这个问题几乎天天出现在ASP.NET论坛上,因此值得再次提出来。

另外,ScriptManager.IsInAsyncPostBack仅在部分回传时为true。这个属性可以用于进一步区分正在处理的请求属于哪种类型。

UpdatePanel事件在每次请求中都会触发

使用UpdatePanel的生命周期事件(Init, Load, PreRender, Unload)是一种组织你的代码的强大方法,并且你可以在JavaScript中使用__doPostBack来触发UpdatePanel。然而,重要的是理解这些事件在每次页面装载,回传以及部分回传时都将会得到执行。

即使你正在使用UpdatePanelconditional UpdateMode,某些UpdatePanels在某次特定的部分回传中不会被可见更新,所有的UpdatePanels还是会在服务器端被重新创建并执行你为它们所绑定的生命周期事件处理器。

一般,这意味着如果你不想在每次请求过程中都执行它们,那么你应该将你的代码包裹在一个!IsPostBack或者!IsInAsynPostBack条件语句中。然而,一种更怪异的情形是,仅在刷新某个特定的UpdatePanel时,才去执行某段代码。为了完成这个任务,你可以检查__EVENTTARGET:

protected void UpdatePanel1_Prender(object sender, EventArgs e)

{

       //This code will only to be executed if the partial postback was raised by a

       //__doPostBack(‘UpdatePanel 1’ , ‘’)

       if(Request[“__EVENTTARGET”] == UpdatePanel1.ClientID)

       {

              //Insert magic here.

}    

}

控件事件处理器在Load事件之后触发

我的读者经常陷入的一个问题,这也可能是我所见过的排名第二的关于页面生命周期的问题。

举例来说,有一个UpdatePanel和一个Button,它们共同完成一次简单的投票。UpdatePanelLoad事件查询一个数据库表来呈现投票结果,然而Button_Click让用户将它们的投票提交到数据库中。

你能看到其中的问题吗?

如果你看一下副标题,问题是显而易见的。Button_ClickUpdatePanel_Load之后运行,这给用户一个印象,它们的投票没有被计算在内,因为当他们投完票后,投票结果没有改变。

如何改正?不是在UpdatePanel_Load中呈现投票结果,相反,需要在PreRender事件中呈现,因为UpdatePanel_PreRenderButton_Click之后触发。

这听起来简单,但是我们可能都犯过这样的错误。AJAX带来的额外的复杂性使得偶尔很容易忘记隐晦的页面生命周期问题。

总结

l         Page_Load在每次部分回传时都会被触发,普通回传也会触发它。

l         在部分回传时,使用IsPostBackIsInAsyncPostBack来避免执行Page_Load代码。

l         结合__doPostBack__EVENTTARGET可以使得仅仅目标UpdatePanel才会执行它的页面生命周期。

l         控件事件,例如ClickSelectedIndexChanged,在Load事件之后触发。

l         通过使用PreRender而不是Load,你可以控制你的代码执行时间,即先处理控件事件,再执行更新。

总而言之,如果你想开发ASP.NET AJAX页面,那么理解ASP.NET页面生命周期非常重要。我保证如果你今天花上一个小时来深入得研究它,那么将来你会成倍得节省你的时间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值