Asp:UpdatePanel是在Asp.Net WebForm中的一個局部刷新控件,雖然很好用,但是在使用過程中卻發現如果局部刷新的數據需要再次使用頁面js進行格式化,頁面則會亂套,所以在這里我們需要對UpdatePanel的回傳過程進行控制。
1. Sys.WebForms.PageRequestManager類
管理服務器 UpdatePanel 控件在瀏覽器中的部分頁更新,并通過使用客戶端腳本定義屬性、事件和方法以自定義 Web 頁。
//獲取實例對象
var prm = Sys.WebForms.PageRequestManager.getInstance();
2. 回傳的周期控制
initializeRequest
在開始處理異步請求之前引發。 可以使用此事件取消回發。
beginRequest
在開始處理異步回發、將回發發送到服務器之前引發。 可以使用此事件來設置請求標頭,或開始一個動畫以指示正在處理頁面。
pageLoading
在收到服務器對異步回發的響應之后、頁上任何內容更新之前引發。 可以使用此事件為更新的內容提供自定義轉換效果。
pageLoaded
在因同步回發或異步回發而刷新頁上的所有內容之后引發。 可以使用此事件為更新的內容提供自定義轉換效果。
endRequest
在異步回發完成,并且控制權返回到瀏覽器之后引發。 可以使用此事件向用戶提供通知或將錯誤記錄到日志。
3 . 演示
<%@ Page Language="C#" autoeventwireup="true" CodeBehind="Default.aspx.cs" Inherits="Demo.Default" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>UpdatePanel</title>
<link href="Content/bootstrap.min.css" rel="stylesheet" />
<style type="text/css"> .odd { background-color: #00ff90; } .even { background-color: #0094ff; } </style>
</head>
<body>
<p >
<p >
<hr />
<form runat="server">
<p>
<asp:scriptmanager runat="server" ID="ScriptManager"></asp:ScriptManager>
<asp:TextBox runat="server" ID="txtKeyword" CssClass="input-sm"></asp:TextBox>
<asp:Button runat="server" ID="btnSearch" Text="Search..." CssClass="btn btn-primary" OnClick="btnSearch_Click" />
<asp:UpdatePanel runat="server" ID="UpdatePanel">
<ContentTemplate>
<table >
<thead>
<tr>
<th>Id</th>
<th>Name</th>
<th>...</th>
<th>...</th>
<th>...</th>
</tr>
</thead>
<tbody>
<asp:Repeater runat="server" ID="rpTable">
<ItemTemplate>
<tr>
<td><%# Eval("Id") %></td>
<td><%# Eval("Name") %></td>
<td>...</td>
<td>...</td>
<td>...</td>
</tr>
</ItemTemplate>
</asp:Repeater>
</tbody>
</table>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="btnSearch" EventName="Click" />
</Triggers>
</asp:UpdatePanel>
</p>
</form>
</p>
</p>
<script src="Scripts/jquery-1.10.2.min.js"></script>
<script type="text/javascript"> function initTableStyle() {
$('tbody tr').each(function (index, item) {
$(item).addClass(index % 2 == 0 ? 'even' : 'odd'); }); } $(function () {
initTableStyle(); }); </script>
</body>
</html>
using System;
using System.Collections.Generic;
using System.Linq;
namespace Demo
{
public partial class Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
InitEmployees();
List<Employee> lstEmployees = Cache["Employee"] as List<Employee>;
if(lstEmployees != null)
BindingTable(lstEmployees);
}
}
void InitEmployees()
{
if (Cache["Employee"] == null)
{
List<Employee> lstEmployees = new List<Employee>();
lstEmployees.Add(new Employee { Id = 1, Name = "張三" });
lstEmployees.Add(new Employee { Id = 2, Name = "李四" });
lstEmployees.Add(new Employee { Id = 3, Name = "王五" });
lstEmployees.Add(new Employee { Id = 4, Name = "趙六" });
Cache["Employee"] = lstEmployees;
}
}
void BindingTable(IEnumerable<Employee> employees)
{
this.rpTable.DataSource = employees;
this.rpTable.DataBind();
}
protected void btnSearch_Click(object sender, EventArgs e)
{
List<Employee> lstEmployees = Cache["Employee"] as List<Employee>;
if (lstEmployees != null)
{
lstEmployees = lstEmployees.Where(x => x.Name.Contains(this.txtKeyword.Text.Trim())
|| string.IsNullOrEmpty(this.txtKeyword.Text)).ToList();
BindingTable(lstEmployees);
}
}
}
class Employee
{
public int Id { get; set; }
public string Name { get; set; }
}
}
運行結果:
效果就是,上面的通過搜索獲取數據進行展示,然后通過 javascript來控制table的class。運行之后,初始化時貌似沒有什么問題,但是當我們點擊search…按鈕之后,我們發現table的行背景色沒有了,為什么?
這個是因為當我們點擊搜索按鈕之后,新獲取的數據被呈現在頁面上,但是我們初始化表格樣式的javascript代碼并沒有再次執行,所以我們的表格樣式會出現下面的這種情況:
如果我們需要通過javascript來對表格樣式進行再次渲染,那么我們就需要了解UpdatePanel回傳的過程;
下面我們在javascript中加入以下代碼:
var prm = Sys.WebForms.PageRequestManager.getInstance();
prm.add_initializeRequest(function (sender, args) {
console.log('add_initializeRequest');
});
prm.add_beginRequest(function (sender, args) {
console.log('add_beginRequest');
});
prm.add_pageLoading(function (sender, args) {
console.log('add_pageLoading');
});
prm.add_pageLoaded(function (sender, args) {
console.log('add_pageLoaded');
});
prm.add_endRequest(function (sender, args) {
console.log('add_endRequest');
});
當我們再次點擊搜索按鈕之后,瀏覽器控制臺中輸出的的順序為:
add_initializeRequest
add_beginRequest
add_pageLoading
add_pageLoaded
add_endRequest
很明顯,當我們的UpdatePanel每次回傳過程中,這幾個被注冊的事件都會先后執行,我們可以在add_pageLoaded或者add_endRequest中加入我們渲染表格的代碼,我這里就在add_endRequest里面加入這段代碼:
prm.add_endRequest(function (sender, args) {
console.log('add_endRequest');
initTableStyle();
});
再次點擊搜索的結果:
說明我們這樣做完全OK!
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
網絡推廣與網站優化公司(網絡優化與推廣專家)作為數字營銷領域的核心服務提供方,其價值在于通過技術手段與策略規劃幫助企業提升線上曝光度、用戶轉化率及品牌影響力。這...
在當今數字化時代,公司網站已成為企業展示形象、傳遞信息和開展業務的重要平臺。然而,對于許多公司來說,網站建設的價格是一個關鍵考量因素。本文將圍繞“公司網站建設價...
在當今的數字化時代,企業網站已成為企業展示形象、吸引客戶和開展業務的重要平臺。然而,對于許多中小企業來說,高昂的網站建設費用可能會成為其發展的瓶頸。幸運的是,隨...
如何升級BOOTCAMP?訓練營遵循您的Mac操作系統,而不是單獨升級。解決方案:bootcamp 3.0與windows不是很兼容,所以鼠標不能多點觸控,另外,聲卡和顯卡不是很兼容,導致分辨率低,沒有聲音。在windows下運行Apple update(應該在開頭)將bootcamp更新為最新版本。更新并重新啟動后,設置分辨率,設置bootcamp的第一個分區(所選分區將在引導后首先啟動),設置...
共享單車自動扣費怎么弄?騎自行車共享??梢杂弥Ц秾氈Ц?。先打開支付寶。找到自行車共享的專欄。點擊進入。你可以看到它。有掃碼開車這個詞,然后點掃碼開車。下一步是打開藍牙。同意就好。確認以后開車。這樣,當騎行結束時,你就可以打開車鎖。注意鎖車,那你就不用操作支付寶自動支付了。非常方便。共享單車自動扣費怎么弄?共享單自動扣費主要是因為你去單車共享借車玩的時候,騎完還車的時候,第一次打開手機用或者支付寶支...
成都冷凍食品批發在那?1.冷凍食品批發市場:四川省成都市雙流區呂穎楓涇西。2.成都李因冷凍食品交易市場:四川省成都市青白江區貨運大道附近。3.姐妹冷凍食品批發:四川省成都市郫都區陽光北路與陽光南路交叉口西。4.冷凍食品批發部:四川省成都市青羊區興業街附近。5.瑞豐冷凍食品批發:四川省成都市龍泉驛區天盛路附近。6.年翔宇冷凍食品批發:四川省成都市成華區逸夫路。7.誠信冷凍食品批發零售:四川省成都市雙...