關(guān)于URL的傳遞字符串問題的研究_.Net教程
推薦:.NET Framework 3.5 SP1正式版微軟今天發(fā)布了.NET Framework 3.5第一個(gè)SP服務(wù)包的最終版.這是一個(gè)累積更新,包含很多基于.NET Framework 2.0、3.0和3.5不斷生成的新功能,此外還包括.NET Framework 2.0 SP2和.NET Framewo
前幾天我用URL從一個(gè)頁面?zhèn)鬟f字符串到另一個(gè)頁面的時(shí),出現(xiàn)了個(gè)奇怪的問題,我要傳遞的字符串是“DK51 700中繼站”;可是另一個(gè)頁面接收到字符串卻是:“DK51 700中繼口”;加號(hào)變成了空格,“站”不能解析出來,變成了不能識(shí)別的符號(hào)“口”。
我上網(wǎng)查找了原因:URL中有些字符被轉(zhuǎn)義,比如空格被編碼成加號(hào),于是傳的參數(shù)明明是加號(hào),獲取的值卻成了空格。
按照網(wǎng)上的建議,我們應(yīng)該對(duì)要傳遞的參數(shù)進(jìn)行編碼處理。于是,我對(duì)傳遞的參數(shù)進(jìn)行了處理,但是又衍生了一堆問題出來;我當(dāng)時(shí)為了節(jié)約時(shí)間,就沒有仔細(xì)研究,用了字符串中的Replace()方法在傳送前代替了這兩個(gè)字符,接收到了再代替回來�,F(xiàn)在我來具體的展示下這個(gè)問題。
1.首先,我們先看下我的開始的問題(環(huán)境:VS2008):1.1. 新建一個(gè)網(wǎng)站,在其中添加一個(gè)頁面,一個(gè)頁面是Defaul.aspx,另一個(gè)頁面Defaul2.aspx,在第一個(gè)頁面中添加一個(gè)控件:HyperLink1;后臺(tái)代碼:
1.2. 在第二個(gè)頁面中添加一個(gè)Label控件Label1;后臺(tái)代碼:
1.3. 結(jié)果顯示:“DK51 700中繼口”。
2.我當(dāng)時(shí)的解決方法:用了字符串中的Replace()方法在傳送前代替了這兩個(gè)字符,接收到了再代替回來。
2.1第一個(gè)頁面的后臺(tái)代碼:2.2.第二個(gè)頁面中,后臺(tái)代碼:
2.3.結(jié)果是:“DK51 700中繼站”。正確!
后來我在網(wǎng)上找到這個(gè)這樣的設(shè)置,在Web.config中設(shè)置:
這樣的話,就不需要替代中文了,只需要把“ ”替代,中文在這個(gè)過程就不會(huì)出現(xiàn)問題了。
但是這樣的傳遞中文可能還會(huì)遇到其他中文字出問題,最好是采用下面的方法將中文參數(shù)編碼。
3. 我采用URLEncode()編碼,采用URLEncode()不在Web.config中設(shè)置好像也可以,在我的測(cè)試中沒有問題,但是為了安全,我們還是添加上上面的設(shè)置。
3.1.頁面上都是一致的,第一頁面的后臺(tái)代碼:3.2.第二個(gè)頁面中,后臺(tái)代碼:
3.3.結(jié)果是:“DK51 700中繼站”。正確!
后來我在網(wǎng)上找到這個(gè)這樣的設(shè)置,在Web.config中設(shè)置:
這樣的話,就不需要替代中文了,只需要把“ ”替代,中文在這個(gè)過程就不會(huì)出現(xiàn)問題了。
但是這樣的傳遞中文可能還會(huì)遇到其他中文字出問題,最好是采用下面的方法將中文參數(shù)編碼。
4.我采用URLEncode()編碼,采用URLEncode()不在Web.config中設(shè)置好像也可以,在我的測(cè)試中沒有問題,但是為了安全,我們還是添加上上面的設(shè)置。
4.1.頁面上都是一致的,第一頁面的后臺(tái)代碼:
4.2 第二頁面的后臺(tái)代碼:
4.3 結(jié)果是:“DK51 700中繼站”。正確!
注意:一定要前后對(duì)應(yīng),比如在這里,第一頁面中是先編碼的,后替代,第二頁面中就要先替代,再解碼,不然就會(huì)出錯(cuò),如:“DK51 700中繼站”
我在開頭提到,遇到了比較多的問題:
1. 網(wǎng)上的資料有的說是用“ ”來替代“ ”,但是我嘗試了下,結(jié)果卻是錯(cuò)誤的: “DK51 700中繼站”,這是什么原因呢?是網(wǎng)上說錯(cuò)了嗎?但是在下面的情況中,又很讓我苦笑不得,不知道具體是什么原因。
2. 接上面,還是用“ ”來替代“ ”;我在一次錯(cuò)誤的輸入,在第一頁面后臺(tái)輸入了name = Server.UrlEncode(name);第二頁面中解碼是 name = Server.HtmlDecode(name);居然是結(jié)果對(duì)的,“DK51 700中繼站”。我換了其他的替代字符,結(jié)果也是正確的。
但是我換了其他編碼和解碼組合:Server.HtmlEncode(name)和Server.UrlDecode(name),或者Server.HtmlEncode(name)和Server.HtmlDecode(name)組合,結(jié)果就不對(duì)。連中文都不對(duì):“DK51 700中繼口”。
3. 我采用Server.HtmlEncode(name)和Server.HtmlDecode(name)組合,要得到正確的結(jié)果,必須用像“@”這樣的特殊字符來替代“ ”,當(dāng)然還有在Web.config中添加設(shè)置,設(shè)置內(nèi)容如上。
4. 我在查資料的時(shí)候還有提到一種方法;不需要在Web.config中添加設(shè)置,在aspx文件中添加:<meta http-equiv="Content-Type" content="text/html; charset=gb2312">我嘗試了,沒成功。
5. 我還有個(gè)疑問是,在這里,我是用“@”的特殊字符來代替“ ”,因?yàn)樵谖业淖址惺遣豢赡艹霈F(xiàn)“@”,才這樣做的。但是如果我的字符串中可能出現(xiàn)這些特殊字符串,我又該如何替代呢?
6. 我在經(jīng)歷了這些測(cè)試后,覺得最安全的方法,在URL中傳遞參數(shù)時(shí),最好還是使用URLDecode()方法。在Web.config中配置上
配置這個(gè)是需要注意,你的程序中的字符集是不是也用這個(gè)“gb2312”來編碼解碼的,如果不是,就要注意了可能引發(fā)的錯(cuò)誤了。我在程序中就遇到了這個(gè)問題,我的程序中的畫面就是用xml傳遞的,我加了這個(gè)設(shè)置后,就不能顯示畫面,我找了很長時(shí)間,才知道是是兩種編碼規(guī)則沖突。我畫面中設(shè)置的UTF-8,被全局變量復(fù)制了.
分享:淺析ASP.NET MVC :MVC頁面驗(yàn)證與授權(quán)在ASP.NET MVC中,如何來實(shí)現(xiàn)表單的驗(yàn)證與授權(quán)訪問呢?至少在CTP3中,還沒有一個(gè)官方的解決方案。ASP.NET WebForm的表單驗(yàn)證和授權(quán)機(jī)制是否適合在ASP.NET MVC中使用呢?帶著這些問題來進(jìn)入
- asp.net如何得到GRIDVIEW中某行某列值的方法
- .net SMTP發(fā)送Email實(shí)例(可帶附件)
- js實(shí)現(xiàn)廣告漂浮效果的小例子
- asp.net Repeater 數(shù)據(jù)綁定的具體實(shí)現(xiàn)
- Asp.Net 無刷新文件上傳并顯示進(jìn)度條的實(shí)現(xiàn)方法及思路
- Asp.net獲取客戶端IP常見代碼存在的偽造IP問題探討
- VS2010 水晶報(bào)表的使用方法
- ASP.NET中操作SQL數(shù)據(jù)庫(連接字符串的配置及獲取)
- asp.net頁面?zhèn)髦禍y(cè)試實(shí)例代碼
- DataGridView - DataGridViewCheckBoxCell的使用介紹
- asp.net中javascript的引用(直接引入和間接引入)
- 三層+存儲(chǔ)過程實(shí)現(xiàn)分頁示例代碼
- 相關(guān)鏈接:
- 教程說明:
.Net教程-關(guān)于URL的傳遞字符串問題的研究
。