编码StringBuilder查询字符串

时间:2014-04-25 15:21:50

标签: c# encoding urlencode encode stringbuilder

我有一些示例代码,我想构建一个查询字符串,但在代码的末尾,字符串编码不正确,无法在浏览器中使用。

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。有人可以帮忙吗?

谢谢!

3 个答案:

答案 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时,将值拆分为“=”,对结果的第二部分进行编码,将它们连接成一个字符串并存储以供以后使用。