客户端回调--最原始的AJAX

这段时间一直在忙改版,说是改版到不如说是重新开发,加班成了长事,为什么非要加班才能完成任务呢, 加班难道是程序员的宿命吗,是自己的效率低还是。。。。

话归正题,说实话这次改版比原来的旧版有了很到的提高,尤其是在用户体验上,界面上比以前漂亮多了,有意请查看www.ucar.cn

<1>利用XMLHTTPRequest进行服务器端交互,局限性在于只能以字符串的形式返回,不能返回一个对象,往往用在异步加载数据上,需要一个中间进行传输数据的层-一个aspx文件,里面可以放如自己想要返回的内容。。。

js文件:

//  JScript 文件
 
var  console  =   null ;
var  ie  =   false ;
var  READY_STATE_UNINITIALIZED  =   0 ;
var  READY_STATE_LOADING  =   1 ;
var  READY_STATE_LOADED  =   2 ;
var  READY_STATE_INTERACTIVE  =   3 ;
var  READY_STATE_COMPLETE  =   4 ;

var  RESULT_AS_TEXT = 0 ;
var  RESULT_AS_XML  = 1 ;
var  RESULT_AS_STREAM = 2 ;
var  RESULT_AS_ARRAY = 4 ;

 
var  Handler  = null ;
var  resultType =  RESULT_AS_TEXT;
var  req  =   null ;
 
 
// 获取 XMLHTTP 对象
function  initXMLHTTPRequest() {
    
var xRequest = null;      
    
try {
        ie
=true;
        xRequest 
= new ActiveXObject("Msxml2.XMLHTTP");
        
return xRequest;
    }
 
    
catch (othermicrosoft) {
        
try {
            xRequest 
= new ActiveXObject("Microsoft.XMLHTTP");
            
return xRequest;
        }
 
        
catch (failed) {
            ie 
= false;
            
try{
                xRequest 
= new XMLHttpRequest();
                
return xRequest;
            }

            
catch(error){
                alert(error);
            }

        }

    }
 
 }
 
 
// 发送 异步xml requesst
function  sendRequest(url,params,HttpMethod,handler,resulttype) {    
    Handler
=handler;
    resultType
=resulttype;
    
if(!HttpMethod){
        HttpMethod 
= "GET";
    }

    req 
= initXMLHTTPRequest();
     
    
if(req){     
        
//this.req.onreadystatechange = this.onReadyState;
        req.onreadystatechange = onReadyState;
        
try{
            req.open(HttpMethod,url,
true);
        }

        
catch(error){
            alert(error);
        }
         
        req.setRequestHeader(
"Content-Type","application/x-www-form-urlencoded");
        req.send(
null);  
    }

}
 
// 返回结果时处理

function  onReadyState() {     
    
var ready = req.readyState;
    
var result = null;
     
    
if(ready==READY_STATE_COMPLETE){
        
//var result = document.getElementById('result');
        if(req.status==200){    
            
if(resultType==RESULT_AS_TEXT){
                result
= req.responseText;
            }

            
else if(resultType==RESULT_AS_XML){                
                result
= req.responseXML;
            }

            
else if(resultType==RESULT_AS_STREAM){
                result
= req.responseStream;
            }

            
else if(resultType==RESULT_AS_ARRAY){
                result
= req.responseBody;
            }
  
           
            Handler(result);
          
        }

        
else{
            
//result.value = req.status;
        }

    }

    
else{
        
//data = "loading…["+ready+"]";
    }

}
 

 下面是一个用于传输数据的中间层。。。

using  System;
using  System.Data;
using  System.Configuration;
using  System.Collections;
using  System.Web;
using  System.Text;
using  System.Web.Security;
using  System.Web.UI;
using  System.Web.UI.WebControls;
using  System.Web.UI.WebControls.WebParts;
using  System.Web.UI.HtmlControls;
using  bitauto.mis.bll.SecondHandCar.SellsCar;

public   partial   class  salesCar_RecentlyView : System.Web.UI.Page
{
    
protected void Page_Load(object sender, EventArgs e)
    
{
        
string CarID = "";
        
if (Request.Cookies["UcarIDS"!= null)
        
{
            
//Response.Write(Request.Cookies["UcarIDS"].Value.Replace("%2C",",") + "<br/>");
            string ss = Request.Cookies["UcarIDS"].Value.Replace("%2C",",");// Values["UcarID1"];
            if (ss != "")
            
{
                ss 
= ss.TrimStart(new char[] ',' });
                
string[] tt = ss.Split(new char[] ',' });
                
//int k = (tt.Length - 6 > 0) ? tt.Length - 6 : 0;
                for (int j = 0; j < tt.Length; j++)
                
{
                    
if ((!CarID.Contains(tt[j])) && (CarID.Split(new char[] ',' }).Length <= 6))//保证6个最近记录

                        CarID 
+= tt[j] + ",";
                }

                
if (CarID != "")
                    CarID 
= CarID.TrimEnd(new char[] ',' });
            }

        }

        
if (CarID != "")
        
{
            
//if(CarID.Split(new char[] { ',' }).Length >= 6)
            
//    Request.Cookies["UcarIDS"].Value = CarID;
            
//Response.Write(CarID);
            StringBuilder sb = new StringBuilder();
            DataTable ds 
= UcarBasicInfo.ReturnRecentView(CarID);
            
if (ds != null && ds.Rows.Count != 0)
            
{
                
for (int i = 0; i < ds.Rows.Count; i++)
                
{
                    
//if (i % 2 == 0)
                    {
                        sb.Append(
" <div class="inpiccon">");
                        sb.Append(
" <a href='SaleCarInfor.aspx?UcarID=");
                        sb.Append(ds.Rows[i][
"UcarID"+ "' target="_blank"> <div class="carpic">");
                        sb.Append(
"<img id="Img" + i.ToString() + "" src='" + GetPic(bitauto.mis.bll.salesCar.UcarPictureInfo.GetCarPicByUcarID(Ucar.Common.ConvertHelper.GetInteger(ds.Rows[i]["UcarID"]))));
                        sb.Append(
"' runat="server" border='0' style="width:106;height:75px"/></div>");
                        sb.Append(
"<div class="summary"><div class="summary_left"> </div> <div class="summary_right"> <ul><li>");
                        sb.Append(Ucar.Common.StringHelper.SubString(bitauto.mis.bll.Cache.Car_Basic.GetCarNameByCarId(ds.Rows[i][
"CarID"]), 8true));
                        sb.Append(
"</li><li>");
                        sb.Append(Ucar.Common.StringHelper.SubString(BitAuto.Utils.StringHelper.TrimEndZeroForPrice(ds.Rows[i][
"IntendSalePrice"].ToString()), 6true));
                        sb.Append(
"万元</li></ul></div> </div></a> </div>");
                    }

                    
//else
                    
//{
                    
//    sb.Append(" <div class="inpiccon inpiccon_mgleft">");
                    
//    sb.Append(" <a href='SaleCarInfor.aspx?UcarID=");
                    
//    sb.Append(ds.Rows[i]["UcarID"] + "'> <div class="carpic">");
                    
//    sb.Append("<img id="Img" + i.ToString() + "" src='" + GetPic(bitauto.mis.bll.salesCar.UcarPictureInfo.GetCarPicByUcarID(Ucar.Common.ConvertHelper.GetInteger(ds.Rows[i]["UcarID"]))));
                    
//    sb.Append("' runat="server" border='0' style="width:106;height:75px"/></div>");
                    
//    sb.Append("<div class="summary"><div class="summary_left"> </div> <div class="summary_right"> <ul><li>");
                    
//    sb.Append(Ucar.Common.StringHelper.SubString(bitauto.mis.bll.Cache.Car_Basic.GetCarNameByCarId(ds.Rows[i]["CarID"]), 8, true));
                    
//    sb.Append("</li><li>");
                    
//    sb.Append(Ucar.Common.StringHelper.SubString(BitAuto.Utils.StringHelper.TrimEndZeroForPrice(ds.Rows[i]["IntendSalePrice"].ToString()),6,true));
                    
//    sb.Append("万元</li></ul></div> </div></a> </div>");
                    
//}
                }

            }

            Response.Write(sb.ToString());
            Response.End();
        }

    }


    
private string GetPic(string pic)
    
{
        
if (!string.IsNullOrEmpty(pic))
            
return Ucar.Common.ConfigHelper.GetAppSetting("ImageServerPath"+ pic.Replace(".""_middle.");
        
else
            
return "../images/nopicmiddle.jpg";//Ucar.Common.ConfigHelper.GetAppSetting("DefaultImageServerPath");//默认图片
    }

}

具体的业务不必去关心,主要是了解程序的执行过程。。。

调用部分:

 <script language="javascript" type="text/javascript">
     function GettRecentView()
    {     
        var requestUrl="RecentlyView.aspx";
        if(initXMLHTTPRequest()!==null)
        {
          
            sendRequest(requestUrl,null,"GET",GettRecentViewResult,RESULT_AS_TEXT);
        }       
    }   
    function GettRecentViewResult(responseText)
    {
        document.getElementById("dv1").innerHTML=responseText;
    }
    function ShowResult(arg)
    {
       return;
    }

</script >

<2>实现C#的一个接口,ICallbackEventHandler就可以实现回调了,

实现ICallbackEventHandler接口的方法:

  public   void  RaiseCallbackEvent( string  eventArgument)
        
{
            
if (IsTimeOut())
            
{
                
//判断手机是否存在
                BitAuto.Services.UserManager.IUserManager m_userManager = BitAuto.Services.UserManager.UserManagerFactory.GetUserManagerInstance("BitautoGlobal");
                BitAuto.Services.UserManager.Model.UserInfoAll dsUserInfoAll 
= m_userManager.FindUserByWhere("UserAccount.MobilePhone='" + eventArgument + "'"null);
                
if (dsUserInfoAll == null)
                
{
                    
string ValidateCode = CreateValidateCode();
                    
//发短信
                    SmsHelper.SendLongMessage(eventArgument, SendContent(ValidateCode));
                    
//将验证信息添加到库中
                    MobileValidateCode.Add(eventArgument, ValidateCode);
                    
//ScriptHelper.ShowAlertScript(this, "验证码已发送到您手机上,请注意查收!");

                    retStr 
= "验证码已发送到您手机上,请注意查收!";
                }

                
else
                
{
                    
//this.txtpwd1.Text = "1231231";
                    
//ScriptHelper.ShowAlertScript(this, "该手机号码已经注册!");
                    retStr = "该手机号码已经注册!";
                }

            }

            
else
            
{
                
//ScriptHelper.ShowAlertScript(this, "60秒内仅能获取一次验证码,请稍后再试!");
                retStr = "60秒内仅能获取一次验证码,请稍后再试!";
            }

        }


        
#endregion

        
public   void  RegistScriptForCallBack()
        
{
            StringBuilder strb 
= new StringBuilder("function CallToServer(arg, context){");
            strb.Append(
this.ClientScript.GetCallbackEventReference(this"arg""ShowResult"""));
            strb.Append(
"}");

            ClientScript.RegisterClientScriptBlock(
this.GetType(), "ValatePhone", strb.ToString(), true);
        }


关键在于RegistScriptForCallBack方法的实现,在服务端注册个js方法

调用部分:

js:

function GetValate(txtid)
    {
        var str=document.getElementById(txtid).value;
        if(!new RegExp("^13[0-9]{9}$|^0{0,1}15[3,8,9]{1}[0-9]{8}$","g").test(str))
        {
            return;
        }
        if(!SetTime())
        {
         return;
        }
        CallToServer(str,"");
    }
    function ShowResult(arg)
    {
        alert(arg);
    }

   <span style="color: Teal; cursor: pointer;" οnclick="GetValate('<%= txtmobile.ClientID %>')"> &nbsp;&nbsp;获取手机验证码</span>

<3>借助ajax.dll在前面已经介绍过了在此不在多说了。。。。。

  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值