这段时间一直在忙改版,说是改版到不如说是重新开发,加班成了长事,为什么非要加班才能完成任务呢, 加班难道是程序员的宿命吗,是自己的效率低还是。。。。
话归正题,说实话这次改版比原来的旧版有了很到的提高,尤其是在用户体验上,界面上比以前漂亮多了,有意请查看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"]), 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>");
}
//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 %>')"> 获取手机验证码</span>
<3>借助ajax.dll在前面已经介绍过了在此不在多说了。。。。。