利用JavaScript通过URL方式向后台代码传值是一种经常用到的手段,但在传递汉字时经常会出现字符不全或变成乱码的问题,其原因是由于客户端IE浏览器的编码方式为GB2312(简体中文版WINDOWS的默认设置),而后台的C#代码使用utf8编码(创建WEB工程的默认配置)。
网上有很多方案解决该问题,如将web.config的编码方式改为GB2312、在客户端通过escape先编码再传,个心体会都不是很理想或有些特殊字符不支持。经过比较我决定使用encodeURIComponent在客户端进行编码,再传值,除了“/”不支持(但实际开发中很少需要传递该值,如果真有此请况,再加一层判断即可。
encodeURIComponent的帮助文档如下:
encodeURIComponent方法
将文本字符串编码为一个统一资源标识符(URI)的一个有效组件。
encodeURIComponent(encodedURIString)
必选的encodedURIString参数代表一个已编码的URI组件。
说明
encodeURIComponent方法返回一个已编码的URI。如果您将编码结果传递给decodeURIComponent,那么将返回初始的字符串。因为encodeURIComponent方法对所有的字符编码,请注意,如果该字符串代表一个路径,例如/folder1/folder2/default.html,其中的斜杠也将被编码。这样一来,当该编码结果被作为请求发送到web服务器时将是无效的。如果字符串中包含不止一个URI组件,请使用encodeURI方法进行编码。
要求
版本5.5
请参阅
decodeURI方法|decodeURIComponent方法
应用于:Global对象
我做了一个小例子来展现该效果
Default.aspx代码:
复制代码 代码如下:
<%@PageLanguage="C#"AutoEventWireup="true"CodeFile="Default.aspx.cs"Inherits="_Default"%>
<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<htmlxmlns="http://www.w3.org/1999/xhtml">
<headrunat="server">
<title>无标题页</title>
</head>
<scripttype="text/javascript"language="javascript">
functioncallURL(Value1,Value2)
{
document.URL="Default.aspx?Value1="+encodeURIComponent(Value1)+"&Value2="+encodeURIComponent(Value2);
}
</script>
<body>
<formid="form1"runat="server">
<div>
Value1=<inputid="Text1"type="text"value="1234567890"/><br/>
Value2=<inputid="Text2"type="text"value="中华人民共和国"/>
<br/>
<inputid="Button1"type="button"value="提交"onclick="callURL(Text1.value,Text2.value)"/></div>
</form>
</body>
</html>
Default.aspx.cs代码:
复制代码 代码如下:
usingSystem;
usingSystem.Data;
usingSystem.Configuration;
usingSystem.Web;
usingSystem.Web.Security;
usingSystem.Web.UI;
usingSystem.Web.UI.WebControls;
usingSystem.Web.UI.WebControls.WebParts;
usingSystem.Web.UI.HtmlControls;
publicpartialclass_Default:System.Web.UI.Page
{
protectedvoidPage_Load(objectsender,EventArgse)
{
stringtmpValue1="";
stringtmpValue2="";
if(Request.QueryString["Value1"]!=null)
{
tmpValue1=Request.QueryString["Value1"].ToString();
}
if(Request.QueryString["Value2"]!=null)
{
tmpValue2=Request.QueryString["Value2"].ToString();
}
Response.Write("Value1="+tmpValue1+"<br/>"+"Value2="+tmpValue2);
}
}