最近项目中用到微软提供的UpdatePanel来做ajax,考虑其简洁性和易用性,便毫不考虑就采用此方案,可是项目遇到一个让我很是头疼的问题,场景如下:
在一个UpdatePanel有一个GridView,其中该GridView的某些列是在服务器端通过逻辑控制显示的效果,代码如下:
protected virtual void ListGridView_RowDataBound(object sender, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.DataRow) { if (e.Row.RowState == DataControlRowState.Normal || e.Row.RowState == DataControlRowState.Alternate) { if (e.Row.FindControl("DeleteButton") != null) { ((LinkButton)e.Row.FindControl("DeleteButton")).Attributes.Add("onclick", "javascript:return confirm('你确认要删除该条数据吗?');");
e.Row.Cells[e.Row.Cells.Count - 3].Text = string.Format(Constants.UIStringDisabledLinkTemp, "download", "附件不存在,不能下载!"); } } } }
在页面第一次加载的时候,其一切都正常,可是当点击GridView的排序的时候,之前格式化的附件不能下载的列,就发生了诡异变化,本来页面初始化的时候判断是不能下载,应该显示灰色的下载图片,可是点击排序后页面的图片就都变成亮色了,跟断点没有发现什么错误,可是如果把GridView从UpdatePanel中拿出来,执行上面的操作没有问题,就是在UpdatePanel中就有问题。
自己分析一下,UpdatePanel实际就是指定一个局部刷新的面板,当该面板中有任何请求服务器端的请求(其实就是_doPostBack事件),微软的ScriptManager都会截获请求,然后用ajax的方式发送到服务器端,从而实现异步刷新局部区域,当然在请求结束后页面updatepanel内的元素将会重新刷新为最新的dom元素,这就让我纳闷了,难道我的代码在服务器端没有执行,可是断点显示在服务器端的逻辑一切都正常,可是就是到客户端就发生这种莫名其妙的灾难,难道是页面的缓存?经过测试也不是,或者说页面返回的dom元素是数据在还没全部渲染后就返回的?或者说RowDataBound事件在服务器没有执行完,就返回到页面了?
总之很多的疑惑让我很费解,还请那位大侠来指点一下,不胜感激。
8 回答
九州编程
TA贡献1785条经验 获得超4个赞
问题终于解决,在服务器端GridViewCommand事件里,在点击EditButtong的逻辑里,最后要bindData一下,因为这样才能再一次让GridView自动调用RowDataBound事件,这样DeleteButton的状态就会正常,看来没有弄明白事件的执行顺序啊,惭愧!
手掌心
TA贡献1942条经验 获得超3个赞
感谢你的回复,的确使用这个UpdatePanel也就是在这个项目中使用,根据我的理解:
UpdatePanel其实就是微软设定一个局部更新的区域,他又很多更新方式,可以支持传统的post更新,也支持异步更新,UpDateMode等一些基础的特性都已经学习了,还有客户端的ScriptManager客户端生命周期也基本了解:begin_request, pageLoading, pageLoaded, endRequest等客户端事件,不知道这里的问题是什么原因导致的,update的基本属性都已经尝试过也研究过也没发现解决方案,还请大侠指教.
- 8 回答
- 0 关注
- 437 浏览
添加回答
举报
0/150
提交
取消