关于使用ICallbackEventHandler接口 ,传递中文时的错误
初次使用ICallbackEventHandler接口实现Ajax就遇到中文编码的问题,郁闷了一下午,终于看到了一篇文章,赶紧分享出来
今天上线了一个项目,上线之后发现用户线上报名提交报名信息的时候居然报错,之前在测试服务器上运行正常。更奇怪的是只有IE和Chrome报错FireFox居然运行正常,于是在后台文件中加入跟踪日志文件跟踪用户提交的信息,发现IE提交的用户数据传到服务器端全部都是乱码。这种情况很可能是编码的问题,项目的web.config配置了<globalization requestEncoding="gb2312" responseEncoding="gb2312" />页面上其他很多的地方都是gb2312的编码,不想讲编码改为utf-8,在本地试验着将js提交给后台的参数用escape编码后再调用回传接口,然后在后台代码中将提交过来的参数用Server.UrlDecode("test")进行解码,本地运行正常,更新正式服务器的系统之后运行也正常。
下面贴出部分代码,以下是没有修改之前的代码:
前台提交数据的JS代码:
function submitData()
{
var strProv = document.getElementById('ddlProv').value;
var strCity = document.getElementById('ddlCity').value;
var strInternetbar = document.getElementById('ddlinternetBar').value;
var strRegion = document.getElementById('txtRegion').value;
var arg = strProv + "|" + strCity + "|" + strInternetbar + "|" + strRegion;
<%=ClientScript.GetCallbackEventReference(this, "arg", "GetFlag", "")%>
}
function GetFlag(arg)
{
var args = arg.split("|");
var returncode = args[0];
var returnvalue = args[1];
if (returncode == "0")
{
document.getElementById('btnApply').style.display = 'none';
document.getElementById('btnUpdate').style.display = 'none';
document.getElementById('tof').style.display = '';
}
else if (returncode == "-200")
{
alert(returnvalue);
top.location = 'http://www.cnblogs.com/default.html';
}
else
{
alert(returnvalue);
}
}
</script>
后台接受回传参数的代码:
{
m_strArguments = eventArgument;
if (string.IsNullOrEmpty(m_strArguments))
{
m_strReturn = string.Format("{0}|{1}", -1, "参数错误");
return;
}
string[] strArguments = m_strArguments.Split('|');
if (strArguments.Length != 4)
{
m_strReturn = string.Format("{0}|{1}", -1, "参数错误");
return;
}
m_strProv = strArguments[0];//省份
m_strCity = strArguments[1];//城市
m_strInternetbar = strArguments[2];//网吧
m_strRegion = strArguments[3];//大区
//验证数据的合法性
//提交数据到DB中
}
这样的代码在正式环境下运行提交时中文提交到服务器端会出现乱码,导致程序解析参数的时候会出现错误,不能正常的提交数据。
(可是为什么在测试服务器的时候却没有出现错误?还待研究......)
修改后的前台JS代码:
function submitData()
{
var strProv = document.getElementById('ddlProv').value;
var strCity = document.getElementById('ddlCity').value;
var strInternetbar = document.getElementById('ddlinternetBar').value;
var strRegion = document.getElementById('txtRegion').value;
var arg = escape(strProv) + "|" + escape(strCity) + "|" + escape(strInternetbar) + "|" + escape(strRegion);
<%=ClientScript.GetCallbackEventReference(this, "arg", "GetFlag", "")%>
}
function GetFlag(arg)
{
var args = arg.split("|");
var returncode = args[0];
var returnvalue = args[1];
if (returncode == "0")
{
document.getElementById('btnApply').style.display = 'none';
document.getElementById('btnUpdate').style.display = 'none';
document.getElementById('tof').style.display = '';
}
else if (returncode == "-200")
{
alert(returnvalue);
top.location = 'http://www.cnblogs.com/default.html';
}
else
{
alert(returnvalue);
}
}
</script>
后台CS代码:
{
m_strArguments = eventArgument;
if (string.IsNullOrEmpty(m_strArguments))
{
m_strReturn = string.Format("{0}|{1}", -1, "参数错误");
return;
}
string[] strArguments = m_strArguments.Split('|');
if (strArguments.Length != 4)
{
m_strReturn = string.Format("{0}|{1}", -1, "参数错误");
return;
}
m_strProv = Server.UrlDecode(strArguments[0]);//省份
m_strCity = Server.UrlDecode(strArguments[1]);//城市
m_strInternetbar = Server.UrlDecode(strArguments[2]);//网吧
m_strRegion = Server.UrlDecode(strArguments[3]);//大区
//验证数据的合法性
//提交数据到DB中
}
编译DLL之后更新系统dll并且更新页面,运行程序提交报名数据成功。问题是解决了,但是还是有两个问题让我疑惑:
1.为什么在测试服务器上运行正常?
2.为什么只有IE和Chrome运行错误提交到服务器端得中文会乱码而FireFix确实正常的?
这两个问题还有待研究,同时希望高手提点一二。
看来以后得养成一个习惯,在涉及到url传参和回传传递参数时一定要将参数编码滞后在传递。
详细出处参考:http://www.pqshow.com/program/aspnet/200909/9619.html