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

ASP.NET
Asp.net 时间操作基类(支持短日期,长日期,时间差)
asp.net 获取机器硬件信息(cpu频率、磁盘可用空间、内存容量等)
asp.net 数据库备份还原(sqlserver+access)
Asp.Net 数据操作类(附通用数据基类)
Asp.net 弹出对话框基类(输出alet警告框)
Asp.net 文件上传类(取得文件后缀名,保存文件,加入文字水印)
Asp.net Socket客户端(远程发送和接收数据)
Asp.net 字符串操作基类(安全,替换,分解等)
Asp.Net数据输出到EXCEL表格中
asp.net Gridview里添加汇总行
asp.net UpdatePanel的简单用法
asp.net ajaxControlToolkit FilteredTextBoxExtender的简单用法
this connector is disabled错误的解决方法
sql事务应用积累
asp.net Page.Controls对象(找到所有服务器控件)
在asp.NET中字符串替换的五种方法
ASP.NET缓存方法分析和实践示例代码
asp.net 在DNN模块开发中遇到的resx怪问题
ASP.NET State service状态服务的问题解决方法
asp.net 结合mysql存储过程进行分页代码

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-23   浏览: 129 ::
收藏到网摘: 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的组合问题,传递时和接收时,编码,替代,解码,的先后顺序。这些花了很多时间,头都绕晕了,本来想把所以的过程都写出来的,但是考虑到篇幅太多了,还是就写这些。希望大家能有好的建议。