最近項目中用到微軟提供的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 關注
- 533 瀏覽
添加回答
舉報
0/150
提交
取消