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

ASP.NET
FreeTextBox(版本3.1.6)在ASP.Net 2.0中使用方法
.NET 常用功能和代码小结
在 .NET Framework 2.0 中未处理的异常导致基于 ASP.NET 的应用程序意外退出
asp.net IList查询数据后格式化数据再绑定控件
asp.net sql存储过程
asp.net 简单实现禁用或启用页面中的某一类型的控件
asp.net(c#)获取内容第一张图片地址的函数
The remote procedure call failed and did not execute的解决办法
ASP.NET 在线文件管理
asp.net 读取并修改config文件实现代码
ASP.NET Cookie 操作实现
asp.net Silverlight中的模式窗体
Silverlight中动态获取Web Service地址
asp.net Silverlight应用程序中获取载体aspx页面参数
asp.net 水晶报表隔行换色实现方法
asp.net 获取Gridview隐藏列的值
手动把asp.net的类生成dll文件的方法
asp.net 使用ObjectDataSource控件在ASP.NET中实现Ajax真分页
动态指定任意类型的ObjectDataSource对象的查询参数
asp.net Md5的用法小结

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


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