ajax中Sys.WebForms.PageRequestManager的事件激发顺序

 ajax中Sys.WebForms.PageRequestManager的事件激发顺序

 

 

测试代码:

 

[c-sharp] view plain copy print ?
  1. 测试代码如下:  
  2.   
  3. <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Test.aspx.cs" Inherits="AjaxCtpWebDemo.Test" %>  
  4.   
  5. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  6.   
  7. <html xmlns="http://www.w3.org/1999/xhtml" >  
  8. <head runat="server">  
  9.     <title>无标题页</title>  
  10. </head>  
  11. <body>  
  12.     <form id="form1" runat="server">  
  13.       
  14.         <asp:ScriptManager ID="ScriptManager1" runat="server">  
  15.         </asp:ScriptManager>  
  16.         <%=DateTime.Now.ToString() %><hr/>  
  17.         <asp:UpdatePanel ID="UpdatePanel1" runat="server">  
  18.             <ContentTemplate>  
  19.                 <%=DateTime.Now.ToString() %>  
  20.                 <hr/>  
  21.                 <asp:Button ID="Button1" runat="server" Text="Button" />  
  22.             </ContentTemplate>  
  23.         </asp:UpdatePanel>  
  24.        <mce:script  type="text/javascript" language="javascript"><!--  
  25.           Sys.WebForms.PageRequestManager.getInstance().add_initializeRequest(  
  26.       function(sender, e)  
  27.       {  
  28.           alert("add_initializeRequest");     
  29.       }  
  30.   );  
  31.     
  32.     
  33.   Sys.WebForms.PageRequestManager.getInstance().add_endRequest(  
  34.       function(sender,e){  
  35.           alert("add_endRequest");  
  36.       }  
  37.   );  
  38.     
  39.     
  40.   Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(  
  41.       function(sender,e){  
  42.           alert("add_beginRequest");  
  43.       }  
  44.   );  
  45.     
  46.     
  47.   Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(  
  48.       function(sender,e){  
  49.           alert("add_pageLoaded");  
  50.       }  
  51.   );  
  52.     
  53.   Sys.WebForms.PageRequestManager.getInstance().add_pageLoading(  
  54.       function(sender,e){  
  55.           alert("add_pageLoading");  
  56.       }  
  57.   );  
  58.     
  59.     
  60. // --></mce:script>   
  61.     
  62.     </form>  
  63. </body>  
  64. </html>  

测试代码如下: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Test.aspx.cs" Inherits="AjaxCtpWebDemo.Test" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>无标题页</title> </head> <body> <form id="form1" runat="server"> <asp:ScriptManager ID="ScriptManager1" runat="server"> </asp:ScriptManager> <%=DateTime.Now.ToString() %><hr/> <asp:UpdatePanel ID="UpdatePanel1" runat="server"> <ContentTemplate> <%=DateTime.Now.ToString() %> <hr/> <asp:Button ID="Button1" runat="server" Text="Button" /> </ContentTemplate> </asp:UpdatePanel> <mce:script type="text/javascript" language="javascript"><!-- Sys.WebForms.PageRequestManager.getInstance().add_initializeRequest( function(sender, e) { alert("add_initializeRequest"); } ); Sys.WebForms.PageRequestManager.getInstance().add_endRequest( function(sender,e){ alert("add_endRequest"); } ); Sys.WebForms.PageRequestManager.getInstance().add_beginRequest( function(sender,e){ alert("add_beginRequest"); } ); Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded( function(sender,e){ alert("add_pageLoaded"); } ); Sys.WebForms.PageRequestManager.getInstance().add_pageLoading( function(sender,e){ alert("add_pageLoading"); } ); // --></mce:script> </form> </body> </html>

 

 

 

 

最终结果如下:

1.页面第一次进入时,会首先激发add_pageLoaded事件

2.异步提交时,事件的激发顺序如下:

add_initializeRequest

add_beginRequest

add_pageLoading

add_pageLoaded

add_endRequest

add_pageLoaded

 

转:http://www.cnblogs.com/fifastar/archive/2008/06/02/1212225.html

 

 

获取PageRequestManager的实例:var prm = Sys.WebForms.PageRequestManager.getInstance(); 属性prm.get_isInAsyncPostBack():判断一个异步回送是否正在进行中

方法prm.abortPostBack():把一个正在执行中的异步回送取消。

 

客户端页面的生命周期

 

1、initializeRequest: 触发时机:当一个异步请求的回送被初始化之前引发。        添加事件处理代码:Sys.WebForms.PageRequestManager.getInstance().add_initializeRequest(initFunc);        移除事件处理代码:Sys.WebForms.PageRequestManager.getInstance().remove_initializeRequest(initFunc);            initFunc是该页面初始化之前要执行的客户端方法。该方法的声明为:            function initFunc(sender,args)            {                 //args的数据类型是:InitializeRequestEventArgs类型。                 //args.get_postBackElement():取得初始化异步回送的元素对象。                    //args.get_postBackElement().id取得初始化异步回送的元素对象的id号                    //args.get_postBackElement().value取得初始化异步回送的元素对象的value值                 //args.set_cancel(bool):取消初始化异步回送,即丢弃该异步回送。            }         如果异步处理的过程比较慢,在异步处理的过程中再次发出同样的请求的话,那后者的异步处理请求会取消掉前一步未处理完的请求。  这就是默认的异步请求优先级--“后者优先”。         我们通常回利用initailizeRequest事件来取消一个异步回送(正在进行的回送和将要初始化的回送)。      

[c-sharp] view plain copy print ?
  1. <asp:ScriptManager ID="ScriptManager1" runat="server" />  
  2.     <asp:UpdateProgress ID="UpdateProgress1" runat="server" DisplayAfter="0" DynamicLayout="false">  
  3.         <ProgressTemplate>  
  4.             <span style="color: Red" mce_style="color: Red">Loading...</span>  
  5.         </ProgressTemplate>  
  6.     </asp:UpdateProgress>  
  7.     <asp:UpdatePanel ID="UpdatePanel1" runat="server">  
  8.         <ContentTemplate>  
  9.             <%=DateTime.Now %><br />  
  10.             <asp:Label ID="Label1" runat="server" Text=""></asp:Label><br />  
  11.             <asp:Button ID="btnPrecedence" runat="server" Text="优先" OnClick="btnPrecedence_Click" />  
  12.             <asp:Button ID="Button2" runat="server" Text="普通" OnClick="btnPrecedence_Click" />  
  13.         </ContentTemplate>  
  14.     </asp:UpdatePanel>  
  15.     <div id="Message" style="color: Red" mce_style="color: Red">  
  16.     </div>  
  17.   
  18.     <mce:script type="text/javascript" language="javascript"><!--  
  19.         var lastPostBackButtonId=null;          //上一次事件 控件ID  
  20.         var btnPrecedenceId = "<%=this.btnPrecedence.ClientID %>"   //优先级高的控件ID  
  21.           
  22.         Sys.WebForms.PageRequestManager.getInstance().add_initializeRequest(  
  23.             function(sender,e)  
  24.             {  
  25.                 //定义一个全局PageRequestManager实例赋值给变量 prm  
  26.                 var prm = Sys.WebForms.PageRequestManager.getInstance();  
  27.                 //是否已有异步刷新  
  28.                 if(prm.get_isInAsyncPostBack())  
  29.                 {  
  30.                     if(lastPostBackButtonId==btnPrecedenceId)       //上次跟本次都是点击优先按钮  
  31.                     {  
  32.                         e.set_cancel(true);//取消异步更新  
  33.                         if(e.get_postBackElement().id==btnPrecedenceId)  
  34.                         {  
  35.                             showMessage("不可重复发起优先的刷新1。");  
  36.                         }else  
  37.                         {  
  38.                             showMessage("请等待优先的刷新结束2。");  
  39.                         }  
  40.                         return;  
  41.                     }  
  42.                     else if(e.get_postBackElement().id==btnPrecedenceId) //本次点击是优先按钮,但上次却不是优先按钮  
  43.                     {  
  44.                         showMessage("发起优先的刷新,普通的刷新将被取消3。");  
  45.                     }  
  46.                     else //本次点击不是优先按钮,上次点击也不是优先按钮  
  47.                     {  
  48.                         showMessage("重新发起普通刷新,前一次将被取消4。");  
  49.                     }  
  50.                 }  
  51.                 lastPostBackButtonId = e.get_postBackElement().id;  
  52.             }  
  53.         );  
  54.       
  55. // --></mce:script>  
  56.   
  57.     <mce:script type="text/javascript" language="javascript"><!--  
  58.             var timeoutSeed = null;  
  59.             function showMessage(message,timeout)  
  60.             {  
  61.                 $get("Message").innerHTML = message;  
  62.                 //连续发送请求,把前一个清楚掉  
  63.                 if(timeoutSeed)  
  64.                 {  
  65.                     window.clearTimeout(timeoutSeed);  
  66.                 }  
  67.                 timeoutSeed = window.setTimeout(function(){$get("message").innerHTML="";  
  68.                 },timeout||2500)  
  69.             }  
  70.               
  71.       
  72. // --></mce:script>  

<asp:ScriptManager ID="ScriptManager1" runat="server" /> <asp:UpdateProgress ID="UpdateProgress1" runat="server" DisplayAfter="0" DynamicLayout="false"> <ProgressTemplate> <span style="color: Red" mce_style="color: Red">Loading...</span> </ProgressTemplate> </asp:UpdateProgress> <asp:UpdatePanel ID="UpdatePanel1" runat="server"> <ContentTemplate> <%=DateTime.Now %><br /> <asp:Label ID="Label1" runat="server" Text=""></asp:Label><br /> <asp:Button ID="btnPrecedence" runat="server" Text="优先" OnClick="btnPrecedence_Click" /> <asp:Button ID="Button2" runat="server" Text="普通" OnClick="btnPrecedence_Click" /> </ContentTemplate> </asp:UpdatePanel> <div id="Message" style="color: Red" mce_style="color: Red"> </div> <mce:script type="text/javascript" language="javascript"><!-- var lastPostBackButtonId=null; //上一次事件 控件ID var btnPrecedenceId = "<%=this.btnPrecedence.ClientID %>" //优先级高的控件ID Sys.WebForms.PageRequestManager.getInstance().add_initializeRequest( function(sender,e) { //定义一个全局PageRequestManager实例赋值给变量 prm var prm = Sys.WebForms.PageRequestManager.getInstance(); //是否已有异步刷新 if(prm.get_isInAsyncPostBack()) { if(lastPostBackButtonId==btnPrecedenceId) //上次跟本次都是点击优先按钮 { e.set_cancel(true);//取消异步更新 if(e.get_postBackElement().id==btnPrecedenceId) { showMessage("不可重复发起优先的刷新1。"); }else { showMessage("请等待优先的刷新结束2。"); } return; } else if(e.get_postBackElement().id==btnPrecedenceId) //本次点击是优先按钮,但上次却不是优先按钮 { showMessage("发起优先的刷新,普通的刷新将被取消3。"); } else //本次点击不是优先按钮,上次点击也不是优先按钮 { showMessage("重新发起普通刷新,前一次将被取消4。"); } } lastPostBackButtonId = e.get_postBackElement().id; } ); // --></mce:script> <mce:script type="text/javascript" language="javascript"><!-- var timeoutSeed = null; function showMessage(message,timeout) { $get("Message").innerHTML = message; //连续发送请求,把前一个清楚掉 if(timeoutSeed) { window.clearTimeout(timeoutSeed); } timeoutSeed = window.setTimeout(function(){$get("message").innerHTML=""; },timeout||2500) } // --></mce:script>

 

 

[c-sharp] view plain copy print ?
  1. protected void Page_Load(object sender, EventArgs e)  
  2.     {  
  3.   
  4.     }  
  5.     protected void btnPrecedence_Click(object sender, EventArgs e)  
  6.     {  
  7.         Thread.Sleep(3000);  
  8.         Button button = sender as Button;  
  9.         Label1.Text = String.Format("您点击了“{0}”按钮", button.Text);  
  10.     }  

protected void Page_Load(object sender, EventArgs e) { } protected void btnPrecedence_Click(object sender, EventArgs e) { Thread.Sleep(3000); Button button = sender as Button; Label1.Text = String.Format("您点击了“{0}”按钮", button.Text); }

 

 

2、beginRequest:        触发时机:在异步请求初始化完成,且向服务器提出请求之前引发。        添加事件处理代码:Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(beginFunc);        移除事件处理代码:Sys.WebForms.PageRequestManager.getInstance().remove_beginRequest(beginFunc);            beginFunc是向服务器提出请求之前要执行的客户端方法。该方法的声明为:            function beginFunc(sender,args)            {                 //args的数据类型是:BeginRequestEventArgs类型。                 //args.get_postBackElement():取得初始化异步回送的元素对象。            }         我们通常在beginRequest事件中设置一个标头,或是启始化一个动化告知用户正在进行请求处理。     

[c-sharp] view plain copy print ?
  1. <asp:UpdatePanel ID="UpdatePanel1" runat="server">  
  2.         <ContentTemplate>  
  3.             <%=DateTime.Now %><br />  
  4.             <asp:Button ID="Button1" runat="server" Text="Button1" OnClick="Button_Click" />  
  5.         </ContentTemplate>  
  6.         <Triggers>  
  7.             <asp:AsyncPostBackTrigger ControlID="Button2" />  
  8.         </Triggers>  
  9.     </asp:UpdatePanel>  
  10.     <asp:UpdateProgress ID="UpdateProgress1" runat="server" DisplayAfter="0" AssociatedUpdatePanelID="UpdatePanel1">  
  11.         <ProgressTemplate>  
  12.             <span style="color: Red" mce_style="color: Red">Loading...</span>  
  13.         </ProgressTemplate>  
  14.     </asp:UpdateProgress>  
  15.     <hr />  
  16.     <asp:Button ID="Button2" runat="server" Text="Button2" OnClick="Button_Click" />  
  17.   
  18.     <mce:script type="text/javascript" language="javascript"><!--  
  19.         Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(  
  20.             function(sender,e)  
  21.             {  
  22.                 if(e.get_postBackElement().id != "<%=this.Button2.ClientID %>")  
  23.                 {  
  24.                     return;  
  25.                 }  
  26.                   
  27.                 var updateProgress = $get("<%=this.UpdateProgress1.ClientID %>");  
  28.                 var dynamicLayout = <%=this.UpdateProgress1.DynamicLayout.ToString().ToLower() %>;  
  29.                 if(dynamicLayout)  
  30.                 {  
  31.                     updateProgress.style.display = "block";  
  32.                 }else  
  33.                 {  
  34.                     updateProgress.style.visibility = "visible";  
  35.                 }  
  36.             }  
  37.         )  
  38.       
  39. // --></mce:script>  

<asp:UpdatePanel ID="UpdatePanel1" runat="server"> <ContentTemplate> <%=DateTime.Now %><br /> <asp:Button ID="Button1" runat="server" Text="Button1" OnClick="Button_Click" /> </ContentTemplate> <Triggers> <asp:AsyncPostBackTrigger ControlID="Button2" /> </Triggers> </asp:UpdatePanel> <asp:UpdateProgress ID="UpdateProgress1" runat="server" DisplayAfter="0" AssociatedUpdatePanelID="UpdatePanel1"> <ProgressTemplate> <span style="color: Red" mce_style="color: Red">Loading...</span> </ProgressTemplate> </asp:UpdateProgress> <hr /> <asp:Button ID="Button2" runat="server" Text="Button2" OnClick="Button_Click" /> <mce:script type="text/javascript" language="javascript"><!-- Sys.WebForms.PageRequestManager.getInstance().add_beginRequest( function(sender,e) { if(e.get_postBackElement().id != "<%=this.Button2.ClientID %>") { return; } var updateProgress = $get("<%=this.UpdateProgress1.ClientID %>"); var dynamicLayout = <%=this.UpdateProgress1.DynamicLayout.ToString().ToLower() %>; if(dynamicLayout) { updateProgress.style.display = "block"; }else { updateProgress.style.visibility = "visible"; } } ) // --></mce:script> 

 

 

[c-sharp] view plain copy print ?
  1. protected void Page_Load(object sender, EventArgs e)  
  2.     {  
  3.   
  4.     }  
  5.     protected void Button_Click(object sender, EventArgs e)  
  6.     {  
  7.         Thread.Sleep(2000);  
  8.     }  

protected void Page_Load(object sender, EventArgs e) { } protected void Button_Click(object sender, EventArgs e) { Thread.Sleep(2000); }     

 

3、pageLoading:         触发时机:异步回送已经被服务器接收并响应,但还没有对页面进行任何更新之前引发         添加事件处理代码:Sys.WebForms.PageRequestManager.getInstance().add_pageLoading(loadingFunc);         移除事件处理代码:Sys.WebForms.PageRequestManager.getInstance().remove_pageLoading(loadingFunc);              loadingFunc是页面更新之前要执行的客户端方法。该方法的声明为:              function loadingFunc(sender,args)              {                 //args的数据类型是:PageLoadingEventArgs类型。                 //args代表内容将要被更新或删除的UpdatePanel控件的<div>。                 //var arr = args.get_panelsDeleting(); 取得将被删除的各个UpdatePanel控件的<div>                 //var arr = args.get_panelsUpdating();取得将被更新的各个UpdatePanel控件的<div>              }

 

5、endRequest:        触发时机:回送请求处理完毕后,就会引发endRequest事件。        添加事件处理代码:Sys.WebForms.PageRequestManager.getInstance().add_endRequest(endFunc);        移除事件处理代码:Sys.WebForms.PageRequestManager.getInstance().remove_endRequest(endFunc);            endFunc是页面请求完成后执行的客户端方法。该方法的声明为:            function endRequest(sender,args)            {                 //args的数据类型是:EndRequestEventArgs类型                 //var err = args.get_error():判断是否发生错误,并取得错误对象。                 //var em = args.get_error().message:取得错误的出错信息。                 //args.set_errorHandled(true):设置错误已被处理。                 //var gm = args.get_errorHandled():判断错误是否被处理。                 //异步请求发生异常后,如果程序员不在客户端捕获处理的话,PageRequestManager对象会将其以对话框的形式弹出异常的信息。如果程序员想自己编写错误处理代码,而不交由PageRequestManager对象处理的话。那程序员可以通过args.get_error().message属性取得错误信息,然后编写异常处理代码,最后记得执行args.set_errorHandled(true)。这样就阻止异常继续回返给PageRequestManager对象。具体使用在后面将详细说明。            }

[c-sharp] view plain copy print ?
  1. <asp:UpdatePanel ID="UpdatePanel1" runat="server">  
  2.         <ContentTemplate>  
  3.             <%=DateTime.Now %><br />  
  4.             <asp:Button ID="btnError" runat="server" Text="Error" OnClick="btnError_Click" />  
  5.             <asp:Button ID="btnTimeout" runat="server" Text="Timeout" OnClick="btnTimeout_Click" />  
  6.             <input id="button" type="button" value="Abort" οnclick="Sys.WebForms.PageRequestManager.getInstance().abortPostBack();" />  
  7.             <asp:Button ID="btnDataItem" runat="server" Text="Reister DataItem" OnClick="btnDataItem_Click" />  
  8.         </ContentTemplate>  
  9.     </asp:UpdatePanel>  
  10.   
  11.     <mce:script type="text/javascript"><!--  
  12.         Sys.WebForms.PageRequestManager.getInstance().add_endRequest(  
  13.             function(sender,e){  
  14.                 if(e.get_error())  
  15.                 {  
  16.                     e.set_errorHandled(true);  
  17.                       
  18.                     if(e.get_response().get_timedOut())  
  19.                     {  
  20.                         showMessage("您的请求已超时。")  
  21.                     }else if(e.get_response().get_statusCode() != 200)  
  22.                     {  
  23.                         showMessage("遇到未知错误。");  
  24.                     }else  
  25.                     {  
  26.                         showMessage(e.get_error().message);  
  27.                     }  
  28.                 }else if(e.get_response().get_aborted())  
  29.                 {  
  30.                     showMessage('您的请求已取消')  
  31.                 }  
  32.                 else  
  33.                 {  
  34.                     var upId = "<%= this.UpdatePanel1.ClientID %>";  
  35.                     var item =e.get_dataItems()[upId];  
  36.                     showMessage("您注册了:"+item);  
  37.                 }  
  38.             });  
  39.       
  40. // --></mce:script>  

<asp:UpdatePanel ID="UpdatePanel1" runat="server"> <ContentTemplate> <%=DateTime.Now %><br /> <asp:Button ID="btnError" runat="server" Text="Error" OnClick="btnError_Click" /> <asp:Button ID="btnTimeout" runat="server" Text="Timeout" OnClick="btnTimeout_Click" /> <input id="button" type="button" value="Abort" οnclick="Sys.WebForms.PageRequestManager.getInstance().abortPostBack();" /> <asp:Button ID="btnDataItem" runat="server" Text="Reister DataItem" OnClick="btnDataItem_Click" /> </ContentTemplate> </asp:UpdatePanel> <mce:script type="text/javascript"><!-- Sys.WebForms.PageRequestManager.getInstance().add_endRequest( function(sender,e){ if(e.get_error()) { e.set_errorHandled(true); if(e.get_response().get_timedOut()) { showMessage("您的请求已超时。") }else if(e.get_response().get_statusCode() != 200) { showMessage("遇到未知错误。"); }else { showMessage(e.get_error().message); } }else if(e.get_response().get_aborted()) { showMessage('您的请求已取消') } else { var upId = "<%= this.UpdatePanel1.ClientID %>"; var item =e.get_dataItems()[upId]; showMessage("您注册了:"+item); } }); // --></mce:script>

 

 

[c-sharp] view plain copy print ?
  1. protected void Page_Load(object sender, EventArgs e)  
  2.    {  
  3.        ScriptManager.GetCurrent(Page).AsyncPostBackTimeout = 3;  
  4.    }  
  5.    protected void btnError_Click(object sender, EventArgs e)  
  6.    {  
  7.        int two = 2;  
  8.        int i = 3 / (two - 2);  
  9.    }  
  10.    protected void btnTimeout_Click(object sender, EventArgs e)  
  11.    {  
  12.        Thread.Sleep(5000);  
  13.    }  
  14.    protected void btnDataItem_Click(object sender, EventArgs e)  
  15.    {  
  16.        ScriptManager.GetCurrent(this).RegisterDataItem(UpdatePanel1, DateTime.Now.ToString());  
  17.    }  

protected void Page_Load(object sender, EventArgs e) { ScriptManager.GetCurrent(Page).AsyncPostBackTimeout = 3; } protected void btnError_Click(object sender, EventArgs e) { int two = 2; int i = 3 / (two - 2); } protected void btnTimeout_Click(object sender, EventArgs e) { Thread.Sleep(5000); } protected void btnDataItem_Click(object sender, EventArgs e) { ScriptManager.GetCurrent(this).RegisterDataItem(UpdatePanel1, DateTime.Now.ToString()); }

 

 

 

4、pageLoaded:         触发时机:回送完成页面区域被更新之后引发。         添加事件处理代码:Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(loadedFunc);         移除事件处理代码:Sys.WebForms.PageRequestManager.getInstance().remove_pageLoaded(loadedFunc);            loadedFunc是页面更新后要执行的客户端方法。该方法的声明为:            function loadedFunc(sender,args)            {                 //args的数据类型是:PageLoadedEventArgs类型                 //args代表更新的或创建的UpdatePanel控件的<div>                 //var arr = args.get_panelsUpdated();取得被更新的各个UpdatePanel控件的<div>                 //var arr = args.get_panelsCreated();取得新创建的各个UpdatePanel控件的<div>            }

 

转载于:https://www.cnblogs.com/lh123/p/3998703.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值