ajax 返回历史记录

时间:2022-11-06 22:50:49
ajax回调总是返回老的历史记录。
在Java和.net中均遇到这样的情况,现在贴出.net代码。
JS代码:

var XMLHttpReq;
  //创建XMLHttpRequest对象       
function createXMLHttpRequest() {
if (window.XMLHttpRequest) { //Mozilla 浏览器
XMLHttpReq = new XMLHttpRequest();
} else {
if (window.ActiveXObject) { // IE浏览器
try {
XMLHttpReq = new ActiveXObject("Msxml2.XMLHTTP");
}
catch (e) {
try {
XMLHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
}
catch (e) {
}
}
}
}
}
//发送请求函数
function SendRequest(url,fun) {
createXMLHttpRequest();
XMLHttpReq.open("GET", url, true);
XMLHttpReq.onreadystatechange = fun;//指定响应函数
XMLHttpReq.send(null);  // 发送请求
}
    // 处理返回信息函数
    function SetResult() {
    if (XMLHttpReq.readyState == 4) { // 判断对象状态
             if (XMLHttpReq.status == 200) { // 信息已经成功返回,开始处理信息
             var xmlDoc=XMLHttpReq.responseXML.documentElement;
             var txtGuID=document.getElementById("<%=txtGuID.ClientID%>");
             var str=xmlDoc.getElementsByTagName("id")[0].firstChild.data;
             str=str.substring(1,str.length);
             var id=parseInt(str,10)+1;
             if(id<100)
                 txtGuID.value="h0"+id.toString();
             else
                 txtGuID.value="h"+id.toString();
                         
                } else { //页面不正常
                    window.alert("您所请求的页面有异常。");
                }
            }
    }
function getHelpId()
{
    var txtGuID=document.getElementById("<%=txtGuID.ClientID%>");
    if(txtGuID.value!=null&&txtGuID.value=="")
    {
        SendRequest("GetHelpId.ashx",SetResult);
    }
}


C#后台代码

public class GetHelpId : IHttpHandler
{
    
    public void ProcessRequest (HttpContext context) {
        context.Response.Clear();
        context.Response.ContentType = "text/xml";
        context.Response.ContentEncoding = System.Text.Encoding.UTF8;//设置输出流为简体中文
        DevSoft.Train.Model.Config model = new DevSoft.Train.Model.Config();
        Object[]obj = DevSoft.Train.Bll.ConfigImpl.GetHelpList(model);//此处为调用数据库,返回一个最大的ID
        System.Data.DataTable dt = ((System.Data.DataSet)obj[0]).Tables[0];
        System.Text.StringBuilder str = new System.Text.StringBuilder();
        str.Append("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
        str.Append("<response>");
        for (int i = 0; i < dt.Rows.Count; i++)
        {
            str.AppendFormat("<id>{0}</id>", dt.Rows[i]["MaxID"].ToString());
        }
        str.Append("</response>");
        context.Response.Write(str);
        
    }
 
    public bool IsReusable {
        get {
            return false;
        }
    }

}


C#前台代码
 <asp:TextBox ID="txtGuID"  runat="server" CssClass="myTextbox" onFocus="getHelpId()" Width="200" />

上面的代码作用是,当我点击文本框时,此文本框获取一个数据库中最大ID,并将该ID增1;上面数据库调用部分肯定正确的。
假设,我数据库有一个最大ID为“h070”,当我第一次点击文本框的时候,返回的是“h070”,文本框中为“h071”;
当我保存了这个ID之后(转到另一个页面做保存),再次增加操作(回到该页面),点击文本框时,它还是返回“h070”,文本框中为“h071”;不知道这是怎么回事?
另外上次遇到的下拉列表保持原来的值,是因为js函数回调引起的,即客户端变化,而服务端不变化,我应该不属于这种情况吧?

6 个解决方案

#1


自己顶一个

#2


Ajax请求缓存引起的问题

SendRequest("GetHelpId.ashx?"+Math.random(),SetResult);
每次发请求加上随机数就可以了。

#3


加个随机参数,因为ie会默认缓存
SendRequest("GetHelpId.ashx? rd="+new Date().valueOf(),SetResult);

#4


"SendRequest("GetHelpId.ashx",SetResult);"
加一個隨機參數,讓其刷新

#5


IE中如果XMLHttpRequest提交的URL与历史一样则使用缓存,根本不向服务器端提交。因此无法取到刚提交的数据或新的数据
改进服务器端
直接加上<%@ OutPutCache Location="None"%>即可。
但是如果后台是.ashx文件通常在类里直接修改缓存设置。
        context.Response.Cache.SetCacheability(HttpCacheability.NoCache);
改进客户端
利用加随机数或加时间戳改变请求地址
加随机数:var url='AjaxOperations.aspx?rdm='+Math.random()+'&action='+op;
加时间戳:var url='AjaxOperations.aspx?dtStamp='+new Date().getTime()+'&action='+op; 

前台异步调用设置XMLHttpRequest对象的属性
在XMLHttpRequest发送请求之前加上XMLHttpRequest.setRequestHeader("If-Modified-Since","0")

#6


好收藏
引用 5 楼 wuyq11 的回复:
IE中如果XMLHttpRequest提交的URL与历史一样则使用缓存,根本不向服务器端提交。因此无法取到刚提交的数据或新的数据
改进服务器端
直接加上 <%@ OutPutCache Location="None"%>即可。
但是如果后台是.ashx文件通常在类里直接修改缓存设置。
        context.Response.Cache.SetCacheability(HttpCacheability.NoCache);
改进客户端
利用加随机数或加时间戳改变请求地址
加随机数:var url='AjaxOperations.aspx?rdm='+Math.random()+'&action='+op;
加时间戳:var url='AjaxOperations.aspx?dtStamp='+new Date().getTime()+'&action='+op;

前台异步调用设置XMLHttpRequest对象的属性
在XMLHttpRequest发送请求之前加上XMLHttpRequest.setRequestHeader("If-Modified-Since","0")

#1


自己顶一个

#2


Ajax请求缓存引起的问题

SendRequest("GetHelpId.ashx?"+Math.random(),SetResult);
每次发请求加上随机数就可以了。

#3


加个随机参数,因为ie会默认缓存
SendRequest("GetHelpId.ashx? rd="+new Date().valueOf(),SetResult);

#4


"SendRequest("GetHelpId.ashx",SetResult);"
加一個隨機參數,讓其刷新

#5


IE中如果XMLHttpRequest提交的URL与历史一样则使用缓存,根本不向服务器端提交。因此无法取到刚提交的数据或新的数据
改进服务器端
直接加上<%@ OutPutCache Location="None"%>即可。
但是如果后台是.ashx文件通常在类里直接修改缓存设置。
        context.Response.Cache.SetCacheability(HttpCacheability.NoCache);
改进客户端
利用加随机数或加时间戳改变请求地址
加随机数:var url='AjaxOperations.aspx?rdm='+Math.random()+'&action='+op;
加时间戳:var url='AjaxOperations.aspx?dtStamp='+new Date().getTime()+'&action='+op; 

前台异步调用设置XMLHttpRequest对象的属性
在XMLHttpRequest发送请求之前加上XMLHttpRequest.setRequestHeader("If-Modified-Since","0")

#6


好收藏
引用 5 楼 wuyq11 的回复:
IE中如果XMLHttpRequest提交的URL与历史一样则使用缓存,根本不向服务器端提交。因此无法取到刚提交的数据或新的数据
改进服务器端
直接加上 <%@ OutPutCache Location="None"%>即可。
但是如果后台是.ashx文件通常在类里直接修改缓存设置。
        context.Response.Cache.SetCacheability(HttpCacheability.NoCache);
改进客户端
利用加随机数或加时间戳改变请求地址
加随机数:var url='AjaxOperations.aspx?rdm='+Math.random()+'&action='+op;
加时间戳:var url='AjaxOperations.aspx?dtStamp='+new Date().getTime()+'&action='+op;

前台异步调用设置XMLHttpRequest对象的属性
在XMLHttpRequest发送请求之前加上XMLHttpRequest.setRequestHeader("If-Modified-Since","0")