我有一些示例代码,我想构建一个查询字符串,但在代码的末尾,字符串编码不正确,无法在浏览器中使用。
public partial class UrlBuilder : System.Web.UI.UserControl
{
public string Title { get; set; }
public string Url { get; set; }
public bool EnableQryString { get; set; }
public string QueryString1 { get; set; }
public string QueryString2 { get; set; }
public string QueryString3 { get; set; }
public string QueryString4 { get; set; }
public string QueryString5 { get; set; }
protected void Page_Load(object sender, EventArgs e)
{
lnkUrl.Text = Title;
lnkUrl.NavigateUrl = Url;
if (EnableQryString)
{
StringBuilder SB = new StringBuilder();
SB.AppendLine("?");
#region Query String builder
if (!QueryString1.IsNullOrEmpty())
{
SB.AppendLine(QueryString1);
}
if (!QueryString2.IsNullOrEmpty())
{
SB.AppendLine("&" + QueryString2);
}
if (!QueryString3.IsNullOrEmpty())
{
SB.AppendLine("&" + QueryString3);
}
if (!QueryString4.IsNullOrEmpty())
{
SB.AppendLine("&" + QueryString4);
}
if (!QueryString5.IsNullOrEmpty())
{
SB.AppendLine("&" + QueryString5);
}
#endregion
lnkUrl.NavigateUrl += HttpUtility.UrlEncode(SB.ToString());
}
}
}
这是后面的字符串:
HttpUtility.UrlEncode(SB.ToString());
http://www.google.com%3f%0d%0aA%3d1%0d%0a%26B%3d2%0d%0a
我认为我没有正确使用UrlEncode。有人可以帮忙吗?
谢谢!
答案 0 :(得分:2)
您正在使用AppendLine
,它会在您的字符串中添加回车符(新行),这可以通过您的网址字符串中的%0d
看到。
只需更改逻辑即可使用字符串构建器Append
方法。
示例是:
if (!QueryString1.IsNullOrEmpty())
{
SB.Append(QueryString1);
}
编辑:或者如果您只想编码参数。
if (!QueryString1.IsNullOrEmpty())
{
SB.Append(HttpUtility.UrlEncode(QueryString1));
}
我认为可以通过任何一种方式完成,http://msdn.microsoft.com/en-us/library/h10z5byc.aspx的文档说它可以用来编码整个网址
答案 1 :(得分:1)
您应该在查询字符串的每个单独值上调用HttpUtility.UrlEncode()
,而不是在整个字符串上调用SB.Append("&name=" + HttpUtility.UrlEncode(value));
。像
{{1}}
答案 2 :(得分:0)
您正在对所有网址进行编码,您应该只对参数值进行编码,因此在对其进行编码时,必须在设置QueryStringX之前对这些值进行编码,并且不对其他任何内容进行编码。
或者更好的方法,在QueryStringX中执行此操作,调用set时,将值拆分为“=”,对结果的第二部分进行编码,将它们连接成一个字符串并存储以供以后使用。