最近项目中用到微软提供的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事件在服务器没有执行完,就返回到页面了?
总之很多的疑惑让我很费解,还请那位大侠来指点一下,不胜感激。
九州编程
三国纷争
手掌心
萧十郎
拉风的咖菲猫