asp.net URL传值出现错误解决
来源:互联网 发布:机械加工工时软件 编辑:程序博客网 时间:2024/05/21 17:23
经网上查询发现原因主要是,URL中有些字符被转义,象空格被编码成加号,于是传的参数明明是加号,获取的值却成了空格。如果按照网上的建议,应该对要传递的参数进行编码处理。于是,我对传递的参数进行了处理,但是又衍生了一堆问题出来;我当时为了节约时间,就没有仔细研究,用了字符串中的Replace()方法在传送前代替了这两个字符,接收到了再代替回来。现在我来具体的展示下这个问题。
1.首先,我们先看下我的开始的问题(环境:VS2008):
1.1. 新建一个网站,在其中添加一个页面,一个页面是Defaul.aspx,另一个网页Defaul2.aspx,在第一个页面中添加一个控件:HyperLink1;
后台代码:
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
string url;
string name;
url = "Default2.aspx?Name=";
name = "DK51+700中继站";
HyperLink1.NavigateUrl = url + name;
}
}
1.2. 在第二个页面中添加一个Label控件Label1;
后台代码:
public partial class Default2 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
string name = Request.QueryString["Name"];
Label1.Text = name;
}
}
1.3. 结果显示:“DK51 700中继口”。
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
string url;
string name;
url = "Default2.aspx?Name=";
name = "DK51+700中继站";
name = name.Replace("+", "@");
name = name.Replace("站", "%");
HyperLink1.NavigateUrl = url + name;
}
}
2.我当时的解决方法:用了字符串中的Replace()方法在传送前代替了这两个字符,接收到了再代替回来。
2.1第一个页面的后台代码:
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
string url;
string name;
url = "Default2.aspx?Name=";
name = "DK51+700中继站";
name = name.Replace("+", "@");
name = name.Replace("站", "%");
HyperLink1.NavigateUrl = url + name;
}
}
2.2.第二个页面中,后台代码:
public partial class Default2 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
string name = Request.QueryString["Name"];
name = name.Replace("@", "+");
name = name.Replace("%", "站");
Label1.Text = name;
}
}
2.3.结果是:“DK51+700中继站”。正确!
后来我在网上找到这个这样的设置,在Web.config中设置:
<system.web>
<globalization requestEncoding="gb2312" responseEncoding="gb2312" culture="zh-CN" fileEncoding="gb2312" />
</system.web>
但是这样的传递中文可能还会遇到其他中文字出问题,最好是采用下面的方法将中文参数编码。
3. 我采用URLEncode()编码,采用URLEncode()不在Web.config中设置好像也可以,在我的测试中没有问题,但是为了安全,我们还是添加上上面的设置。
3.1.
页面上都是一致的,第一页面的后台代码:
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
string url;
string name;
url = "Default2.aspx?Name=";
name = "DK51+700中继站";
name = name.Replace("+", "@");
HyperLink1.NavigateUrl = url + Server.UrlEncode(name);
}
}
3.2.
第二个页面中,后台代码:
public partial class Default2 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
string name = Request.QueryString["Name"];
name = name.Replace("@", "+");
name = name.Replace("%", "站");
Label1.Text = name;
}
}
3.3.结果是:“DK51+700中继站”。正确!
后来我在网上找到这个这样的设置,在Web.config中设置:
<system.web>
<globalization requestEncoding="gb2312" responseEncoding="gb2312" culture="zh-CN" fileEncoding="gb2312" />
</system.web>
但是这样的传递中文可能还会遇到其他中文字出问题,最好是采用下面的方法将中文参数编码。
我采用
4.1.页面上都是一致的,第一页面的后台代码:
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
string url;
string name;
url = "Default2.aspx?Name=";
name = "DK51+700中继站";
name = name.Replace("+", "@");
HyperLink1.NavigateUrl = url + Server.UrlEncode(name);
}
}
4.2 第二页面的后台代码:
public partial class Default2 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
string name = Request.QueryString["Name"];
name = Server.UrlDecode(name);
name = name.Replace("@", "+");
Label1.Text = name;
}
}
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中配置上
<system.web>
<globalization requestEncoding="gb2312" responseEncoding="gb2312" culture="zh-CN" fileEncoding="gb2312" />
</system.web>
配置这个是需要注意,你的程序中的字符集是不是也用这个“
今天理解到了测试时需要很有耐心的,在这个问题中,正确的方法就是可能就是一两种,但是为了测试错误的情况,我做了七八种情况,比如URLEncode,URLDecode和HtmlEncode,HtmlDecode的组合问题,传递时和接收时,编码,替代,解码,的先后顺序。这些花了很多时间,篇幅太多,这里就写这些。
- asp.net URL传值出现错误解决
- asp.net URL传值出现错误解决
- Asp.Net Url 传值出现乱码的解决方法
- 解决ASP.NET中出现’Sys’ is undefined错误
- ASP.NET中URL传参数出现乱码解决方法
- Asp.Net微信发布菜单,出现“invalid sub button url domain hint”错误
- Asp.Net Url 传值出现乱码的解决方法(包括js传值)
- Asp.Net Url 传值出现乱码的解决方法(包括js传值)
- 解决ASP.NET中URL传参乱码问题
- asp.net + ajax出现数据回传错误的处理
- ASP.NET + AJAX 出现 this._form is null' 错误之解决
- 关于ASP.net Web应用程序管理出现错误的处理,应该能解决所有的问题!
- 解决配置ASP.NET Web服务器出现的错误提示“当前服务器不可用”
- Asp.Net(IIS)运行后出现“.dll拒绝访问”错误的解决方法(已解决)
- ASP.NET区 结贴出现错误
- ASP.NET操作EXCEL出现的错误
- 运行ASP.NET 出现程序错误
- asp.net 出现 MAC验证错误
- Win32ASM学习[19]:结构与联合
- Android开发笔记-环境搭建
- Please contact the merchant as the shipping address provided by the merchant is invalid
- linux常用命令---进入与退出
- 【C#】克隆3步骤
- asp.net URL传值出现错误解决
- C语言time.h中clock()函数的使用
- suse 下vsftp 搭建
- 【動態規劃】物品裝箱問題
- 注册表设置快速运行程序
- Linux系统
- 用C#实现简单的验证码
- awk 学习
- android环境搭建2