telerik学习记录-RadAjaxPanel
目錄
RadAjaxPanel 用法
ajaxRequestWithTarget() 參考
ajaxRequest() 參考
常用的RadAjaxControl屬性
方法
服務器端編程
OnAjaxRequest
客戶端編程
ajaxRequest(arguments)
AjaxRequest事件
ajaxRequestWithTarget(eventTarget,eventArgument)
RadAjaxPanel對象
EVENT事件
RadAjaxManager/RadAjaxPanel的客戶端事件
OnRequestStart
OnResponseEnd
取消 AJAX 請求
客戶端確認和AJAX
傳遞更多參數
強制回發
為不同控件分配不同的客戶端事件
在AJAX更新上更改鼠標光標
RadAjaxPanel之間的交互
重定向到另外一個頁面
在AJAX之后滾動到頂部
加載用戶控件
從Ajaxifying中排除控件
使用 RadScriptManager 的 RegisterPostBackControl 方法
通過 OnRequestStart 事件禁用 AJAX(RadAjaxPanel、RadAjaxManager)
在 InitializeRequest 事件上取消 AJAX 請求
手動添加回發功能
排除動態加載的控件
AJAX 更新后執行自定義 Javascript 代碼
RadAjaxPanel 用法
如果要在頁面上啟用 Ajax 的 Web 控件,只需將RadAjaxPanel添加到頁面,然后將要進行回調的控件拖到RadAjaxPanel中。這些控件將開始執行回調而不是回發。
當其中一個控件發出 AJAX 請求時,整個RadAjaxPanel(內部包含所有控件)都會更新。因此,如果將整個頁面放入RadAjaxPanel中,這可能會導致性能降低,因為面板中的所有控件都將被更新,而不僅僅是 AJAX 啟動器。將整個頁面放入RadAjaxPanel在以下情況下可用頁面上的控件數量相對較少。
ajaxRequestWithTarget() 參考
可以使用任何外部控件通過調用此客戶端函數來強制RadAjaxPanel執行 AJAX 請求。使用此函數時,事件目標默認為RadAjaxPanel實例。
_DOPOSTBACK(EVENTTARGET,EVENTARGUMEN或$FIND("<%=RADAJAXPANEL1.CLIENTID%>").AJAXREQUESTWITHTARGET(EVENTTARGET, EVENTARGUMENT)eventTarget 應該引發回發事件的控件。應該使用控件的UniqueID。
eventArgument 事件的可選參數
ajaxRequest() 參考
$FIND("<%=RADAJAXPANEL1.CLIENTID%>").AJAXREQUEST(參數)
arguments 控件在提出請求時使用的參數。
當在客戶端調用ajaxRequestWithTarget、ajaxRequest函數中的任何一個時,它可以在服務器上的 AjaxRequest 事件處理程序中進行處理。
常用的RadAjaxControl屬性
EnableAJAX - 當EnableAJAX屬性設置為true(默認值)時,所有請求(在RadAjaxPanel模板內或由RadAjaxManager管理的控件)都通過 AJAX 處理。如果此屬性為false,則以傳統回發方式處理請求。
EnableHistory - 當EnableHistory屬性設置為true(默認為false)時,即使使用 AJAX 也會啟用瀏覽器歷史記錄。瀏覽器的前進和后退按鈕按預期工作(僅限 IE 瀏覽器)。
EnablePageHeadUpdate - 當您將EnablePageHeadUpdate屬性設置為true(默認值)時,<Head>可以在 AJAX 更新期間修改 Page 元素。當控件初始化為不可見或根據 AJAX 請求動態加載控件時,會發現此功能特別有用。
IsAjaxRequest -當前請求通過 AJAX 時設置此屬性為true ,如果請求是標準回發,則設置此屬性為false 。
DefaultLoadingPanelID - 此屬性允許指定在更新啟用 AJAX 的控件時將顯示的默認LoadingPanel?
UpdatePanelsRenderMode - 此屬性確定呈現 ajax 面板的方式。當選擇Block選項時,面板將呈現為div元素,而如果選擇Inline選項,它們將呈現為span元素。
UpdateInitiatorPanelsOnly - 通過將此屬性設置為true(其默認值為false),只有為特定啟動器添加為UpdatedControls的容器將有條件地更新。
ResponseScripts - 此字符串集合包含您希望在響應返回到瀏覽器時執行的 JavaScript。
方法
RadAjaxManager和RadAjaxPanel都是從RadAjaxControl 繼承而來的,它引入了以下方法:
Alert()-此方法在客戶端上執行 JavaScript alert()。Alert()為要在警報中顯示的文本采用單個字符串參數。
FocusControl - 此方法將焦點放在指定的控件上。FocusControl()采用單個參數,該參數可以是要關注的控件的 ID,也可以是要關注的控件的對象引用。
GetAjaxEventReference - 此方法生成調用ajaxRequest()方法的客戶端代碼
RaisePostBackEvent - 此方法觸發服務器端AjaxRequest事件并允許您將單個字符串參數傳遞給事件。
Redirect-此方法將瀏覽器導航到另一個網頁。該方法傳遞一個字符串參數,即要導航到的 URL。
服務器端編程
OnAjaxRequest
AjaxRequest事件在由客戶端ajaxRequest()函數或服務器端RaisePostBackEvent()方法觸發時發生。活動不能取消。AjaxRequest事件處理程序接收單個字符串參數。
下面的示例演示了從客戶端和服務器觸發的 AjaxRequest。示例中定義了一個 HTML 輸入按鈕和一個標準 ASP.NET 按鈕。HTML 輸入按鈕觸發一個調用客戶端ajaxRequest()的函數。ASP.NET 按鈕觸發服務器端 OnClick 事件,該事件又調用RaisePostBackEvent()方法。
<form id="form1" runat="server"> <telerik:RadScriptManager ID="RadScriptManager1" runat="server"> </telerik:RadScriptManager> <telerik:RadAjaxPanel ID="RadAjaxPanel1" runat="server" OnAjaxRequest="RadAjaxPanel_AjaxRequest"> </telerik:RadAjaxPanel><telerik:RadCodeBlock ID="RadCodeBlock1" runat="server"><script type="text/javascript">function clientClick() {var ajaxManager = $find("<%= RadAjaxPanel1.ClientID %>");ajaxManager.ajaxRequest("client");}</script> </telerik:RadCodeBlock> <div><asp:Button ID="btnServer" runat="server" Text="Make server AjaxRequest" OnClick="btnServer_Click" /><input id="btnClient" type="button" value="Make client AjaxRequest" onclick="clientClick();" /> </div> </form> protected void btnServer_Click(object sender, EventArgs e){RadAjaxPanel1.RaisePostBackEvent("server");}protected void RadAjaxPanel1_AjaxRequest(object sender, Telerik.Web.UI.AjaxRequestEventArgs e){RadAjaxPanel1.Alert("AjaxRequest raised from the " + e.Argument);}客戶端編程
可以使用客戶端API在Ajax請求時調用自己的JavaScript函數;也可以通過JavaScript函數從客戶端想服務器端發出顯示Ajax請求。
ajaxRequest(arguments)
在某些情況下,我們可能希望出發對服務器的回發/ajax請求。在這種情況下,我們可以使用ajaxRequest(arguments)函數來啟動通用AJAX請求。使用該函數時,時間的目標默認為RadAjaxPanel或RadAjaxManager 實例。參數是控件在發出請求時使用的參數。
AjaxRequest事件
當在客戶端調用ajaxRequest函數時,它可以在服務器上的Ajax Request事件處理程序中進行處理,如示例1。
實例1:在客戶端實行ajax請求,在服務器端處理。
<telerik:RadCodeBlock ID="RadCodeBlock1" runat="server"><script type="text/javascript">function InitiateAjaxRequest(arguments) {var ajaxPanel = $find("<%= RadAjaxPanel1.ClientID %>");ajaxPanel.ajaxRequest(arguments);}</script></telerik:RadCodeBlock> private void RadAjaxPanel1_AjaxRequest(object sender, AjaxRequestEventArgs e){//code to handle the generic AJAX request}ajaxRequestWithTarget(eventTarget,eventArgument)
可以調用ajaxRequestWithTarget(eventTarget, eventArgument)函數來模擬由具有指定 UniqueID 和指定參數的另一個控件(?RadAjaxManager或RadAjaxPanel 除外)發送的回發/AJAX 請求。該函數的執行可以由服務器上的相應事件(即Button_Click)來處理。
| eventTarget | 應該引發回發事件的控件。您應該始終使用控件的 UniqueID.. |
| eventArgument | 這是事件的可選參數。 |
ajaxRequestWithTarget被設計為標準doPostBack 函數的替代品。因此,需要覆蓋頁面的 **RaisePostBackEvent 以便在服務器端獲取其參數。
示例 2展示了如何使用 AjaxRequestWithTarget。
示例 3:AjaxButton 強制 Button 引發回發事件。
<asp:ScriptManager ID="ScriptManager" runat="server" /> <telerik:RadAjaxPanel ID="RadAjaxPanel1" runat="server"><input type="button" onclick="AjaxRequestButton(); return false;" value="AjaxButton" /><asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click"></asp:Button><asp:TextBox ID="TextBox1" runat="server" Text=""></asp:TextBox> </telerik:RadAjaxPanel> <telerik:RadCodeBlock ID="cb1" runat="server"><script type="text/javascript">function AjaxRequestButton(arguments) {var ajaxPanel = $find("<%= RadAjaxPanel1.ClientID %>");ajaxPanel.ajaxRequestWithTarget('<%= Button1.UniqueID %>', '');}</script></telerik:RadCodeBlock>后端代碼:
protected void Button1_Click(object sender, System.EventArgs e){TextBox1.Text = DateTime.Now.ToLongTimeString();}RadAjaxPanel對象
下表列出了RadAjaxPanel客戶端對象的重要方法:
| get_ajaxSettings | none | array of objects | 返回一個設置數組,其中每個對象都具有 InitControlID 和另一個 UpdatedControls 數組的屬性。 |
| get_defaultLoadingPanelID | none | string | 返回 DefaultLoadingPanelID |
| get_enableAJAX | none | boolean | 如果啟用 AJAX,則為真。 |
| get_enableHistory | none | boolean | 如果在 AJAX 請求期間啟用了瀏覽器歷史記錄,則為真 |
| set_ajaxSettings | array of objects | none | 設置表示 AjaxSettings 的對象數組 |
| set_defaultLoadingPanelID | string | none | 設置 DefaultLoadingPanelID |
| set_enableAJAX | boolean | none | 允許或阻止請求通過 AJAX 執行。傳遞 True 以允許 AJAX,False 以通過標準回發完成請求 |
| set_enableHistory | boolean | none | 在 AJAX 請求期間允許瀏覽器歷史記錄。傳遞 True 以在 AJAX 請求期間允許瀏覽器歷史記錄 |
示例:
<script type="text/javascript">var ajaxPanel = $find("<%= RadAjaxPanel1.ClientID %>");var settings = ajaxPanel.get_ajaxSettings();var settingsList = '';for (setting in settings) {var initiatingControl = settings[setting].InitControlID;var controls = settings[setting].UpdatedControls;var controlList = '';for (control in controls) {controlList += ' ' + controls[control].ControlID;}settingsList += '\nInitiated by: ' + initiatingControl + '\nUpdated Controls: ' + controlList;}alert(settingsList);</script>EVENT事件
RadAjaxManager/RadAjaxPanel的客戶端事件
RadAjaxManager和RadAjaxPanel都來自RadAjaxControl。RadAjaxControl引入了包含以下事件的AjaxClientEvents屬性:
| OnRequestStart???????? | 當啟動對服務器的請求時觸發 |
| OnRequestEnd | 在處理來自服務器的響應時觸發 |
要使用這些事件,只需編寫一個可在事件發生時調用的 JavaScript 函數(示例 1)。然后將 JavaScript 函數的名稱指定為相應屬性的值。
示例 1:在請求開始和結束時顯示一條消息。
<script type="text/javascript">function requestStart(sender, eventArgs) {alert('Request start');}function responseEnd(sender, eventArgs) {alert('Response complete');} </script> <telerik:RadAjaxPanel ID="RadAjaxPanel1" runat="server" ClientEvents-OnRequestStart="requestStart" ClientEvents-OnResponseEnd="responseEnd" ><telerik:RadButton RenderMode="Lightweight" runat="server" Text="Click me!"></telerik:RadButton> </telerik:RadAjaxPanel>OnRequestStart
OnRequestStart客戶端事件處理程序在啟動對服務器的請求時調用。該事件最初可以由RadAjaxManager設置中配置的啟動控件、?RadAjaxPanel中的控件或客戶端ajaxRequest()調用觸發。活動可以取消。
使用以下方法將兩個參數傳遞給事件處理程序:
-
sender?- 客戶端RadAjaxManager?/?RadAjaxPanel對象的實例。
-
eventArgs,它有以下方法:
-
set_cancel()?- 允許或阻止 AJAX 請求繼續。調用set_cancel(true)會阻止請求繼續。
-
get_eventTarget()?- 獲取提出請求的元素的UniqueID 。
-
get_eventArgument()?- 獲取初始 AJAX 請求中傳遞的字符串。
-
get_eventTargetElement()?- 獲取引發 AJAX 請求的客戶端對象的實例。您可以迭代每個設置并檢索初始控件 ID 和另一個表示更新控件的對象數組。
-
get_enableAjax()?,?set_enableAjax()?- 獲取或設置是否執行 AJAX 請求。set_enableAjax(false)使請求通過標準回發來執行。
下面的示例顯示了發起請求的控件。
<script type="text/javascript">function requestStart(sender, eventArgs) {alert('Request start');} </script> <telerik:RadAjaxPanel ID="RadAjaxPanel1" runat="server" ClientEvents-OnRequestStart="requestStart"><telerik:RadButton RenderMode="Lightweight" runat="server" Text="Click me!"></telerik:RadButton> </telerik:RadAjaxPanel>OnResponseEnd
當從服務器接收到請求時,將調用OnResponseEnd客戶端事件處理程序。活動不能取消。
使用以下方法將兩個參數傳遞給事件處理程序:
-
sender?- 客戶端RadAjaxManager?/?RadAjaxPanel對象的實例。
-
eventArgs,它有以下方法:
-
get_eventTarget()?- 獲取提出請求的元素的UniqueID 。
-
get_eventArgument()?- 獲取初始 AJAX 請求中傳遞的字符串。
-
get_eventTargetElement()?- 獲取引發 AJAX 請求的客戶端對象的實例。
以下示例顯示了發起請求的控件。
<script type="text/javascript">function responseEnd(sender, eventArgs) {alert('Response complete');} </script> <telerik:RadAjaxPanel ID="RadAjaxPanel1" runat="server" ClientEvents-OnResponseEnd="responseEnd" ><telerik:RadButton RenderMode="Lightweight" runat="server" Text="Click me!"></telerik:RadButton> </telerik:RadAjaxPanel>取消 AJAX 請求
可以在 RadAjaxManager/RadAjaxPanel 的OnRequestStart客戶端事件處理程序中取消 AJAX 請求。調用set_cancel(true)可防止請求繼續。
<telerik:RadCodeBlock ID="RadCodeBlock1" runat="server"><script type='text/javascript'>function OnRequestStart(ajaxPanel, eventArgs) {var eventTarget = eventArgs.get_eventTarget();if (eventTarget == "<%= Button1.UniqueID %>") {if (!CheckZipCode()) {eventArgs.set_enableAjax(false); // cancel the ajax request}}}function CheckZipCode() {var zipCode = $get('<%= TextBox1.ClientID %>').value;if (zipCode.length != 5) {alert('Please enter a valid 5 digit postal code!');return false;}else {var fiveDigitCheckRE = /^\d{5}$/ //regular expression for checking a 5 digit numberif (zipCode.search(fiveDigitCheckRE) == -1) {alert("Only digits are allowed!");return false;}}return true;}</script> </telerik:RadCodeBlock>客戶端確認和AJAX
可能需要向用戶提供一個確認對話框,并在接受時啟動 AJAX 請求。使用標準回發的確認通常如下所示:
<asp:ImageButton ID="ImageButton1" runat="server" OnClientClick="return confirm('Are you sure?');" />當通過向RadAjaxManager添加必要的 AJAX 設置或將按鈕放置在RadAjaxPanel控件中時,應稍微更改OnClientClick以使用 AJAX。
<asp:ImageButton ID="ImageButton2" runat="server" OnClientClick="if (!confirm('Are you sure?')) return false;" />或者,我們可以使用OnRequestStart客戶端事件來實現更復雜的邏輯。示例 1顯示了一個示例腳本。
示例 1:使用 OnRequestStart 客戶端事件顯示確認消息。
<telerik:RadCodeBlock ID="RadCodeBlock1" runat="server"> <script type="text/javascript">function OnRequestStart(ajaxControl, eventArgs) {var eventTarget = eventArgs.get_eventTarget(); if (eventTarget == "<%= ImageButton1.UniqueID %>") {return confirm('Are you sure?');}else {return false;}} </script> </telerik:RadCodeBlock>傳遞更多參數
默認情況下,ajaxRequest和ajaxRequestWithTarget函數只接受一個參數。有時可能需要傳遞更多參數。可以通過加入客戶端上的參數來做到這一點:
var arg3 = arg1 + "," + arg2; ajaxPanel.ajaxRequest(arg3);并在RadAjaxPanel1_AjaxRequest的服務器上拆分它們:
private void RadAjaxPanel1_AjaxRequest(object sender, AjaxRequestEventArgs e) {string argument = (e.Argument);String[] stringArray = argument.Split(",".ToCharArray()); }強制回發
如果我們想執行單個回發而不是 AJAX 請求,arguments.EnableAjax應該是false。
在代碼隱藏中:
if (!RadAjaxPanel1.EnableAJAX){RadAjaxPanel1.ClientEvents.OnRequestStart = "OnRequestStart";}在客戶端:
function OnRequestStart(sender, args) {args.set_enableAjax(false); }僅當要執行單個回發時,此方法才有用。如果因為瀏覽器不支持或支持的舊版本而想要禁用 AJAX,應執行此操作:
RadAjaxPanel1.EnableAJAX = Page.Request.Browser.SupportsXmlHttp;為不同控件分配不同的客戶端事件
為了將不同的客戶端事件分配給不同的啟用 AJAX 的控件,可以使用示例 1中所示的方法。
示例 1:可以使用 RadAjaxManager 的客戶端事件來確定 AJAX 請求的目標控件。
<telerik:RadAjaxPanel runat="server" ID="RadAjaxPanel1" ClientEvents-OnRequestStart="Start" ClientEvents-OnResponseEnd="End"><asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" /><asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="True" OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged"><asp:ListItem>111</asp:ListItem><asp:ListItem>222</asp:ListItem></asp:DropDownList> </telerik:RadAjaxPanel> <telerik:RadCodeBlock ID="RadCodeBlock1" runat="server"><script type="text/javascript">function Start(sender, arguments) {if (arguments.EventTarget == "<%= Button1.UniqueID %>") {alert("StartButton");}if (arguments.EventTarget == "<%= DropDownList1.UniqueID %>") {alert("StartDropdown");}}function End(sender, arguments) {if (arguments.EventTarget == "<%= Button1.UniqueID %>") {alert("EndButton");} if (arguments.EventTarget == "<%= DropDownList1.UniqueID %>") {alert("EndDropdown");}}</script> </telerik:RadCodeBlock>這樣DropDownList和Button將具有不同的客戶端事件,盡管它們使用相同的RadAjaxManager或RadAjaxPanel。
在AJAX更新上更改鼠標光標
可以使用 Telerik RadAjax 控件的客戶端事件來更改 Ajax 更新時的鼠標光標。最簡單的方法是使用以下事件腳本:
<script type="text/javascript">function RequestStart(sender, args) {document.body.className = document.body.className.replace("Normal", "Wait");}function ResponseEnd(sender, args) {document.body.className = document.body.className.replace("Wait", "Normal"); </script> <style type="text/css">.Wait{}.Normal{}/* override input cursors with a more specific CSS selector */.Wait INPUT{cursor: wait;}.Normal INPUT{cursor: default;}/* override grid cursors with a more specific CSS selector */.Wait TABLE{cursor: wait;}.Normal TABLE{cursor: default;} </style>RadAjaxPanel之間的交互
此處一個代碼示例,展示了如何在不使用RadAjaxManager的情況下在兩個RadAjaxPanel控件之間進行交互。?Telerik 建議使用RadAjaxManager,盡管可能,但不支持本文中討論的技術。
Telerik 將RadAjaxPanel控件設計為僅更新其內容控件,因此 Telerik Support 始終建議在需要更新外部控件時使用RadAjaxManager 。
但是,可以在不使用RadAjaxManager的情況下實現面板之間的交互。下面的示例演示了一種使用ResponseScripts屬性以及客戶端 ajaxRequest()函數的技術。請注意Page_PreRender事件的使用以及 ViewState 中持久化的屬性。
下面的示例演示如何處理來自一個RadAjaxPanel的 AJAX 請求,以及如何從我們要更新的RadAjaxPanel發起 AJAX 請求。
<telerik:RadScriptManager ID="RadScriptManager1" runat="server"> </telerik:RadScriptManager> <h3>Panel1</h3> <telerik:RadAjaxPanel ID="RadAjaxPanel1" runat="server"> <asp:Button ID="btnIncrease" OnClick="btnIncrease_Click" Text="Increase" runat="server"> </asp:Button> <asp:Label ID="Label1" runat="server">0</asp:Label> <asp:TextBox ID="TextBox1" Text="0" runat="server"></asp:TextBox> </telerik:RadAjaxPanel> <h3>Panel2</h3> <telerik:RadAjaxPanel ID="RadAjaxPanel2" runat="server"> <asp:Button ID="btnDecrease" OnClick="btnDecrease_Click" Text="Decrease" runat="server"> </asp:Button> <asp:Label ID="Label2" runat="server">0</asp:Label> <asp:TextBox ID="TextBox2" Text="0" runat="server"></asp:TextBox> </telerik:RadAjaxPanel> protected void Page_PreRender(object sender, EventArgs e) {if (RadAjaxPanel1.IsAjaxRequest || RadAjaxPanel2.IsAjaxRequest){TextBox1.Text = Label1.Text = TextBox2.Text = Label2.Text = Count.ToString();} } public int Count {get{return this.ViewState["Count"] == null ? 0 : (int)this.ViewState["Count"];}set{this.ViewState["Count"] = value;} } protected void btnIncrease_Click(object sender, System.EventArgs e) {Count++;RadAjaxPanel1.ResponseScripts.Add(String.Format("$find('{0}').ajaxRequest();", RadAjaxPanel2.ClientID)); } protected void btnDecrease_Click(object sender, System.EventArgs e) {Count--;RadAjaxPanel2.ResponseScripts.Add(String.Format("$find('{0}').ajaxRequest();", RadAjaxPanel1.ClientID)); }重定向到另外一個頁面
從服務器重定向到新頁面有兩種基本類型:
-
Response.Redirect()?- 標準的 ASP.NET 重定向方法。
-
生成設置window.location.href的 JavaScript 。
如果 Response.Redirect() 不起作用(例如,如果在部分渲染期間調用),可以通過 RadAjaxManager 和 RadAjaxPanel 公開的 RadAjaxControl.Redirect() 服務器方法使用腳本生成方法。
此 Telerik 方法注冊 JavaScript 代碼,該代碼使用window.location.href屬性導航到新 URL,同時為您提供使用簡單服務器方法的便利。
示例 1:使用RadAjaxManager?Redirect()
RadAjaxManager1.Redirect("http://www.google.com/"); //or RadAjaxManager.GetCurrent(Page).Redirect("http://www.google.com/");示例 1:使用RadAjaxPanel?Redirect()
RadAjaxPanel1.Redirect("http://www.google.com/");在AJAX之后滾動到頂部
示例1演示了在 AJAX 面板中啟用 AJAX 的控件更新后如何將頁面滾動到頂部。
默認情況下,RadAjaxPanel在響應結束時保持 AJAX 化控件的焦點。例如,如果在 AJAX 面板控件中嵌入了頁面底部的按鈕,則更新完成后該按鈕仍將獲得焦點。如果此按鈕位于較長頁面的底部附近,您可能需要在 AJAX 更新結束后將頁面滾動到頂部(可能會放置更新的控件)。您可以使用示例 1中的 JavaScript 函數來執行此操作。
示例 1:此 JavaScript 函數將強制頁面滾動到頂部
<script type="text/javascript">function scrollTop() {window.document.body.scrollTop = 0;window.document.documentElement.scrollTop = 0;} </script>必須將示例 1中的函數添加到RadAjaxPanel控件的ResponseScripts集合中,以便在 AJAX 調用之后執行它。
示例 2:將 scrollTop() 添加到 ResposeScripts 集合。
private void Page_Load(object sender, System.EventArgs e) {RadAjaxPanel1.ResponseScripts.Add("scrollTop();"); }private void cmd1_Click(object sender, System.EventArgs e) {lbl1.Text = System.DateTime.Now.ToString;//set no active elementRadAjaxPanel1.ActiveElementID = null; }RadAjaxManager控件在異步請求后不會保持對活動控件的關注。如果需要聚焦特定控件,可以使用RadAjaxManager FocusControl方法。
加載用戶控件
用戶控件的動態加載遵循與普通回發應用程序相同的邏輯。可以按照以下步驟通過 AJAX 請求加載 customUserControls:
首先需要有一個合適的容器來存放它,例如 asp:Panel。
在Page_Init或Page_Load中實例化用戶控件,并始終重新創建最后加載的用戶控件:
? ? ? ? ? 3.確保為動態加載的用戶控件分配一個唯一的ID
string userControlID = controlName.Split('.')[0]; MyControl.ID = userControlID.Replace("/", "").Replace("~", "");? ? ? ? ? 4.將實例放在容器的空間集合里
Parent.Controls.Add(MyControl)示例:以下示例演示了如何在簡單的場景中實現上述步驟。
<telerik:RadScriptManager ID="RadScriptManager1" runat="server"> </telerik:RadScriptManager> <asp:Button ID="Button1" runat="server" Text="Load WebUserControl1.ascx" OnClick="Button1_Click" /> <asp:Button ID="Button2" runat="server" Text="Load WebUserControl2.ascx" OnClick="Button2_Click" /> <asp:Panel ID="Panel1" runat="server"> </asp:Panel> <telerik:RadAjaxManager ID="RadAjaxManager1" runat="server"><AjaxSettings><telerik:AjaxSetting AjaxControlID="Button1"><UpdatedControls><telerik:AjaxUpdatedControl ControlID="Panel1" /></UpdatedControls></telerik:AjaxSetting><telerik:AjaxSetting AjaxControlID="Button2"><UpdatedControls><telerik:AjaxUpdatedControl ControlID="Panel1" /></UpdatedControls></telerik:AjaxSetting></AjaxSettings> </telerik:RadAjaxManager>后端代碼:
protected void Page_Load(object sender, EventArgs e) {if (this.CurrentControl != string.Empty){LoadMyUserControl(CurrentControl, Panel1);} } protected void Button1_Click(object sender, EventArgs e) {this.LoadMyUserControl("~/WebUserControl1.ascx", Panel1); } protected void Button2_Click(object sender, EventArgs e) {this.LoadMyUserControl("~/WebUserControl2.ascx", Panel1); }private string CurrentControl {get{return this.ViewState["CurrentControl"] == null ? string.Empty : (string)this.ViewState["CurrentControl"];}set{this.ViewState["CurrentControl"] = value;} }private void LoadMyUserControl(string controlName, Control parent) {parent.Controls.Clear();UserControl MyControl = (UserControl)LoadControl(controlName);string userControlID = controlName.Split('.')[0];MyControl.ID = userControlID.Replace("/", "").Replace("~", "");parent.Controls.Add(MyControl);this.CurrentControl = controlName; }加載用戶控件的在線演示
從Ajaxifying中排除控件
默認情況下,RadAjaxPanel?AJAX 啟用所有放置在里面的控件。如果要排除某個控件啟用 AJAX,可以使用以下方法之一:
-
使用RadScriptManager的RegisterPostBackControl方法
-
通過OnRequestStart事件禁用AJAX(RadAjaxPanel、RadAjaxManager)
-
在 InitializeRequest 事件上取消 AJAX 請求
-
手動添加回發功能
-
排除動態加載的控件
使用 RadScriptManager 的 RegisterPostBackControl 方法
可以使用RadScriptManager 的 RegisterPostBackControl方法(示例 1)。
<telerik:RadScriptManager ID="RadScriptManager1" runat="server"></telerik:RadScriptManager><telerik:RadAjaxPanel ID="RadAjaxPanel1" runat="server"><asp:Button runat="server" ID="Button1" Text="Ajax" OnClick="Button_Click" /><asp:Button runat="server" ID="Button2" Text="Postback" OnClick="Button_Click" /><asp:Label ID="Label1" runat="server"></asp:Label></telerik:RadAjaxPanel> protected void Page_Load(object sender, EventArgs e){RadScriptManager1.RegisterPostBackControl(Button2);} protected void Button_Click(object sender, EventArgs e){Label1.Text = DateTime.Now.ToLongTimeString();}當頁面使用RadAjaxManager啟用 AJAX 時,此方法不適用。
通過 OnRequestStart 事件禁用 AJAX(RadAjaxPanel、RadAjaxManager)
使用OnRequestStart客戶端事件處理程序來確定 AJAX 發起程序并為當前請求禁用 AJAX。每個請求都會觸發該事件,因此在下一個請求時,將執行相同的檢查。從啟用 AJAX 的網格導出時,經常使用類似的實現:
在啟用 AJAX 的情況下將 RadGrid 內容導出到 Excel/Word/CSV/PDF
請注意,在RadAjaxManager AJAX 設置的UpdatedControls集合中添加的所有控件都將執行回調而不是回發。要從 ajaxifying 中排除它們,請使用上述方法。
在 InitializeRequest 事件上取消 AJAX 請求
這種方式適用于在廣泛的場景中取消 AJAX 請求(示例 2))。與OnRequestStart事件不同,InitializeRequest將為 Telerik(RadAjaxManager、RadAjaxPanel)和 ASP.NET(UpdatePanel)AJAX 控件觸發。
示例 2:您可以使用 PageRequestManager 的實例添加自定義邏輯
<telerik:RadScriptManager ID="RadScriptManager1" runat="server" /> <script type="text/javascript">Sys.WebForms.PageRequestManager.getInstance().add_initializeRequest(initRequest);function initRequest(sender, args){if (args.get_postBackElement().id.indexOf("CONTROL_ID") != -1){args.set_cancel(true); //stop async requestsender._form["**EVENTTARGET"].value = args.get_postBackElement().id.replace(/\_/g, "$");sender._form["**EVENTARGUMENT"].value = "";sender._form.submit();return;}} </script>請注意,您必須將 CONTROL_ID 字符串替換為觸發 AJAX 請求的控件的實際名稱。
手動添加回發功能
在?aspx/ascx 文件中實現realPostBack函數1。
將自定義OnClick屬性添加到控件(在本例中為按鈕)(示例 3))。
示例 3:ASPX
<telerik:RadCodeBlock ID="codeblock1" runat="server"> <script type="text/javascript">function realPostBack(eventTarget, eventArgument){find("<%= RadAjaxPanel1.ClientID %>").__doPostBack(eventTarget, eventArgument);} </script> </telerik:RadCodeBlock> <asp:Button ID="Button1" runat="server" Text="Button" /> <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox> <telerik:RadScriptManager ID="RadScriptManager1" runat="server"> </telerik:RadScriptManager> <telerik:RadAjaxPanel ID="RadAjaxPanel1" runat="server"><asp:LinkButton ID="LinkButton1" runat="server" Text="PostBack"></asp:LinkButton><asp:LinkButton ID="LinkButton2" runat="server" Text="Ajax"></asp:LinkButton> </telerik:RadAjaxPanel>在后端代碼(Page_Load事件處理程序)中:
protected void Page_Load(object sender, EventArgs e){if (!Page.IsPostBack){LinkButton1.Attributes.Add("onclick", string.Format("realPostBack(\"{0}\", \"\"); return false;", LinkButton1.UniqueID));}}如果沒有在頁面上注冊__doPostBack函數的控件,還應該在Page_Load中添加以下行:
this.Page.ClientScript.GetPostBackEventReference(this, "");當想要單個控件為您的場景執行回發或想要從RadAjaxPanel中的控件上傳文件時,這將派上用場。
排除動態加載的控件
如果正在動態加載用戶控件,則示例 3中的Page_Load事件處理程序中的代碼 if(!Page.IsPostBack) 永遠不會執行。可以檢查附加的OnClick事件而不是IsPostBack,如示例 4所示。
protected void Page_Load(object sender, EventArgs e){bool isOnClickAttached = false;IEnumerator keys = this.CheckBox1.Attributes.Keys.GetEnumerator();while (keys.MoveNext()){if (keys.Current.Equals("onClick")){isOnClickAttached = true;break;}}if (!isOnClickAttached)this.CheckBox1.Attributes.Add("onClick", string.Format("realPostBack(\"{0}\", \"\"); return false;", this.CheckBox1.UniqueID));}AJAX 更新后執行自定義 Javascript 代碼
Telerik?RadAjax提供了執行作為服務器響應的自定義 JavaScript 代碼的能力,從而能夠更靈活地在客戶端上完成更具體或更復雜的任務。接下來展示了在 AJAX 更新后執行自定義 JavaScript 代碼的幾種方法。
最好和最直觀的方法是使用RadAjaxPanel或RadAjaxManager的ResponseScripts屬性。
示例 1顯示了如何在單擊 Button 時彈出警報。
protected void Button1_Click(object sender, System.EventArgs e){RadAjaxPanel1.ResponseScripts.Add(string.Format("alert('Hello from the server! Server time is {0}');", DateTime.Now.ToLongTimeString()));}示例 2顯示了另一種方法。可以使用ScriptManager類的RegisterStartupScript靜態方法:
protected void Button1_Click(object sender, EventArgs e){string script = string.Format("alert('Hello from the server! Server time is {0}');", DateTime.Now.ToLongTimeString());ScriptManager.RegisterStartupScript(Page, typeof(Page), "myscript", script, true);}可以使用PageRequestManager類的pageLoaded事件。
總結
以上是生活随笔為你收集整理的telerik学习记录-RadAjaxPanel的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pixySTM32使用记录(串口SPI外
- 下一篇: QSettings介绍与使用