最近需要修改項目中的登錄功能,之前別人寫好的方法是利用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,所以也就無所謂了~