最近需要修改项目中的登录功能,之前别人写好的方法是利用URL进行参数传递,然后用Request.QueryString方法获取参数。其实我并不喜欢利用URL进行传参,个人还是比较倾向于使用ajax + post的方式进行参数传递。之后写着写着就发现问题了,如果传递的参数值是中文,Request.QueryString方法获取到的参数竟然会乱码!而且同一段代码,不同浏览器之间的效果还不一样!最终在求助度娘后终于解决了问题,下面就分享一下解决方法。首先看一段代码:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta charset="utf-8" />
<title>登录</title>
<script src="Scripts/jquery-1.11.3.min.js"></script>
</head>
<body>
<script>
$(document).ready(function () {
$.ajax({
url: 'TestHandler.ashx?username=张三',
type: 'get',
dataType: 'json',
success: function (data) {
alert(data);
}
})
})
</script>
</body>
</html>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Newtonsoft.Json;
namespace WebApplication1
{
/// <summary>
/// TestHandler 的摘要说明
/// </summary>
public class TestHandler : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";
string userName = context.Request.QueryString["username"].ToString();
context.Response.Write(JsonConvert.SerializeObject(userName));
}
public bool IsReusable
{
get
{
return false;
}
}
}
}
代码十分简单,前端传递一个username参数,参数值为“张三”,后台接收参数后不做任何处理返回给前端。下面我们用Chrome、Firefox、Edge和IE四种浏览器分别测试一下。
Chrome效果:
Firefox效果:
Edge效果:
IE效果:
可以发现,Chrome、Firefox、Edge都能正确运行,IE则出现乱码。要解决IE浏览器下的乱码问题,只需要在Web.config的<system.web></system.web>节点下加一句话就行了:
<system.web>
<globalization requestEncoding="gb2312" responseEncoding="gb2312" culture="zh-CN" fileEncoding="gb2312" />
</system.web>
现在再来测试一下I,可以发现IE正确读取参数值:
需要注意的是,如果使用该方法,IE确实可以正确读取参数,但Chrome、Firefox、Edge则会出现乱码,不过由于我们的项目必须使用IE,所以也就无所谓了~