当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > URL的传递字符串问题小研究

ASP.NET
在C#中导入WebBrowser控件,生成具有强名称的程序集
Asp.Net中的脚本回调和Server.Transfer页面传值
暂时性的解决datagrid控件数据绑定时候xxx字段不属于xxx表的错误
http://www.donews.net/yangwl/archive/2004/10/17/136872.aspx
Some tips for using visual studio .net
Grasshopper简介(节选)
ORACLE 常用的SQL语法和数据对象
[DNN学习所得]让IE也能实现解压缩功能(提供演示源码下载)
学习笔记之Microsoft Windows服务
关于XML:以对象模型为中心
P&P Enterprise Library Extensions
简易的字符替换,可以用于用户自我介绍输入框,简单新闻回复& etc.
缩略图多路径多格式保存
"关机/休眠/重启/注销"的类
[DNN功能]自己动手做语言包
处理WinForm多线程程序时的陷阱
获得光标在多行textbox中的行与列的函数
ADO.NET 和 ADO 的比较
vb.net类的封装,继承,多态,抽象之一
Display XML in AxSHDocVw.AxWebBrowser

ASP.NET 中的 URL的传递字符串问题小研究


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-23   浏览: 297 ::
收藏到网摘: n/a

前几天在调程序的时候遇到了比较郁闷的问题,我用URL从一个页面传递字符串到另一个页面的时,出现了个奇怪的问题,我要传递的字符串是“DK51+700中继站”;可是另一个页面接收到字符串却是:“DK51 700中继口”;加号变成了空格,“站”不能解析出来,变成了不能识别的符号“口”。

我上网查找了原因:URL中有些字符被转义,比如空格被编码成加号,于是传的参数明明是加号,获取的值却成了空格。

按照网上的建议,我们应该对要传递的参数进行编码处理。于是,我对传递的参数进行了处理,但是又衍生了一堆问题出来;我当时为了节约时间,就没有仔细研究,用了字符串中的Replace()方法在传送前代替了这两个字符,接收到了再代替回来。现在我来具体的展示下这个问题。

1.首先,我们先看下我的开始的问题(环境:VS2008):1.1. 新建一个网站,在其中添加一个页面,一个页面是Defaul.aspx,另一个页面Defaul2.aspx,在第一个页面中添加一个控件:HyperLink1;后台代码:

1.2. 在第二个页面中添加一个Label控件Label1;后台代码:

1.3. 结果显示:“DK51 700中继口”。

2.我当时的解决方法:用了字符串中的Replace()方法在传送前代替了这两个字符,接收到了再代替回来。

2.1第一个页面的后台代码:2.2.第二个页面中,后台代码:

2.3.结果是:“DK51+700中继站”。正确!

后来我在网上找到这个这样的设置,在Web.config中设置:

这样的话,就不需要替代中文了,只需要把“+”替代,中文在这个过程就不会出现问题了。

但是这样的传递中文可能还会遇到其他中文字出问题,最好是采用下面的方法将中文参数编码。

3. 我采用URLEncode()编码,采用URLEncode()不在Web.config中设置好像也可以,在我的测试中没有问题,但是为了安全,我们还是添加上上面的设置。

3.1.页面上都是一致的,第一页面的后台代码:3.2.第二个页面中,后台代码:

3.3.结果是:“DK51+700中继站”。正确!

后来我在网上找到这个这样的设置,在Web.config中设置:

这样的话,就不需要替代中文了,只需要把“+”替代,中文在这个过程就不会出现问题了。

但是这样的传递中文可能还会遇到其他中文字出问题,最好是采用下面的方法将中文参数编码。

我采用URLEncode()编码,采用URLEncode()不在Web.config中设置好像也可以,在我的测试中没有问题,但是为了安全,我们还是添加上上面的设置。

4.1.页面上都是一致的,第一页面的后台代码:

4.2 第二页面的后台代码:

4.3 结果是:“DK51+700中继站”。正确!

注意:一定要前后对应,比如在这里,第一页面中是先编码的,后替代,第二页面中就要先替代,再解码,不然就会出错,如:“DK51 700中继站”

我在开头提到,遇到了比较多的问题:1. 网上的资料有的说是用“%20”来替代“+”,但是我尝试了下,结果却是错误的: “DK51 700中继站”,这是什么原因呢?是网上说错了吗?但是在下面的情况中,又很让我苦笑不得,不知道具体是什么原因。

2. 接上面,还是用“%20”来替代“+”;我在一次错误的输入,在第一页面后台输入了name = Server.UrlEncode(name);第二页面中解码是 name = Server.HtmlDecode(name);居然是结果对的,“DK51+700中继站”。我换了其他的替代字符,结果也是正确的。

但是我换了其他编码和解码组合:Server.HtmlEncode(name)和Server.UrlDecode(name),或者Server.HtmlEncode(name)和Server.HtmlDecode(name)组合,结果就不对。连中文都不对:“DK51 700中继口”。

3. 我采用Server.HtmlEncode(name)和Server.HtmlDecode(name)组合,要得到正确的结果,必须用像“@”这样的特殊字符来替代“+”,当然还有在Web.config中添加设置,设置内容如上。

4. 我在查资料的时候还有提到一种方法;不需要在Web.config中添加设置,在aspx文件中添加:<meta http-equiv="Content-Type" content="text/html; charset=gb2312">我尝试了,没成功。

5. 我还有个疑问是,在这里,我是用“@”的特殊字符来代替“+”,因为在我的字符串中是不可能出现“@”,才这样做的。但是如果我的字符串中可能出现这些特殊字符串,我又该如何替代呢?

6. 我在经历了这些测试后,觉得最安全的方法,在URL中传递参数时,最好还是使用URLDecode()方法。在Web.config中配置上

配置这个是需要注意,你的程序中的字符集是不是也用这个“gb2312”来编码解码的,如果不是,就要注意了可能引发的错误了。我在程序中就遇到了这个问题,我的程序中的画面就是用xml传递的,我加了这个设置后,就不能显示画面,我找了很长时间,才知道是是两种编码规则冲突。我画面中设置的UTF-8,被全局变量复制了。

今天理解到了测试时需要很有耐心的,在这个问题中,正确的方法就是可能就是一两种,但是为了测试错误的情况,我做了七八种情况,比如URLEncode,URLDecode和HtmlEncode,HtmlDecode的组合问题,传递时和接收时,编码,替代,解码,的先后顺序。这些花了很多时间,头都绕晕了,本来想把所以的过程都写出来的,但是考虑到篇幅太多了,还是就写这些。希望大家能有好的建议。