C# 是否将字典转换为url参数字符串?

C# 是否将字典转换为url参数字符串?,c#,asp.net-mvc,dictionary,webforms,C#,Asp.net Mvc,Dictionary,Webforms,有没有办法将代码中的字典转换为url参数字符串 e、 g 在没有MVC助手的MVC/Web Forms应用程序中,如何在C Web Forms代码中实现这一点?您可以使用IEnumerable和: 这就是您要寻找的未经测试的代码吗 StringBuilder sb = new StringBuilder(); sb.Append("http://www.somesite.com?"); foreach(var item in parameters) { sb.append(string.For

有没有办法将代码中的字典转换为url参数字符串

e、 g

在没有MVC助手的MVC/Web Forms应用程序中,如何在C Web Forms代码中实现这一点?

您可以使用IEnumerable和:


这就是您要寻找的未经测试的代码吗

StringBuilder sb = new StringBuilder();
sb.Append("http://www.somesite.com?");

foreach(var item in parameters)
{
sb.append(string.Format("{0}={1}&", item.Key, item.Value))
}
string finalUrl = sb.ToString();
finalUrl = finalUrl.Remove(finalUrl.LasIndexOf("&"));
你可以试试这个:

var parameters = new Dictionary<string, string>(); // You pass this
var url = "http://www.somesite.com?";
int i = 0;
foreach (var item in parameters)
{
    url += item.Key + "=" + item.Value;
    url += i != parameters.Count ? "&" : string.Empty;
    i++;
}

return url;
我没有运行逻辑,但这可能会帮助您

如果你想在webforms中使用UrlRouting,那么情况就不同了

退房:

一种办法是:

var url=string.Formathttp://www.yoursite.com?{0}, HttpUtility.UrlEncodestring.Join&, 参数。选择kvp=> string.Format{0}={1},kvp.Key,kvp.Value; 您还可以使用C6中介绍的字符串插值:

变量url=$http://www.yoursite.com?{HttpUtility.UrlEncodestring.Join&,parameters.Selectkvp=>${kvp.Key}={kvp.Value};
如果您不需要UrlEncode,可以将其删除,我只是为了完整性而添加了它。

制作一个静态助手类,也许:

public static string QueryString(IDictionary<string, object> dict)
{
    var list = new List<string>();
    foreach(var item in dict)
    {
        list.Add(item.Key + "=" + item.Value);
    }
    return string.Join("&", list);
}
最短的路:

string s = string.Join("&", dd.Select((x) => x.Key + "=" + x.Value.ToString()));
但时间越短并不意味着效率越高。更好地使用StringBuilder和Append方法:


我编写了以下扩展方法:

将查询字符串添加到基本url:

编辑:


在生产中使用时,考虑用URL编码参数。如果使用此选项,请确保字典中的参数尚未编码。

您可以将以下类添加到项目中并使用扩展方法

using System.Collections.Generic;
using System.Linq;
using System.Text;

public static class CollectionExtensions {
    public static string ToQueryString(this IDictionary<string, string> dict)
    {

    if (dict.Count == 0) return string.Empty;

    var buffer = new StringBuilder();
    int count = 0;
    bool end = false;

    foreach (var key in dict.Keys)
    {
        if (count == dict.Count - 1) end = true;

        if (end)
            buffer.AppendFormat("{0}={1}", key, dict[key]);
        else
            buffer.AppendFormat("{0}={1}&", key, dict[key]);

        count++;
    }

    return buffer.ToString();
}
}

您可以使用Microsoft.AspNetCore.WebUtilities中的查询帮助:

string url = QueryHelpers.AddQueryString("https://me.com/xxx.js", dictionary);

我不是说这个选择更好,我个人认为不是,但我在这里只是想说它存在

班级:

var queryStringDictionary=新字典 { {用户名,foo}, {密码,bar} }; var queryBuilder=newquerybuilderquerystringdictionary; Addtype,用户; //用户名=foo,密码=bar,类型=用户 QueryString结果=queryBuilder.ToQueryString; 我试着用迈克的答案写下这段代码,但没有成功。事实上,这是错误的。让我们看看这个答案有什么问题。 如果您编写HttpUtility.UrlEncodea=1&b=2,它还将encode=和&并返回一个不正确的%3d1%26b%3d2。因此,您需要仅对键和值进行编码,如下所示:

//这很有效 var encodedUrl=string.Formathttp://www.yoursite.com?{0}, string.Join&,parameters.Selectkvp=>string.Format{0}={1}, HttpUtility.UrlEncodekvp.Key,HttpUtility.UrlEncodekvp.Value; 或者使用字符串插值

var encodedUrl=$http://www.yoursite.com?{string.Join&,parameters.Selectkvp=>${HttpUtility.UrlEncodekvp.Key}={HttpUtility.UrlEncodekvp.Value};
使用Newtonsoft JSON,您可以通过生成扩展函数将匿名对象快速序列化为http查询

此方法还支持使用括号将数组作为参数传递给PHP

    public static string Join(this List<string> a, string seperator)
    {
        return string.Join(seperator, a.ToArray());
    }

    public static string ToHttpQuery(this object a)
    {
        string result = "";

        foreach (var b in JObject.FromObject(a))
        {
            if (result.Length > 0)
                result += "&";

            if (b.Value.Type == JTokenType.Array)
                result += b.Value.Select(x => b.Key + "[]=" + Uri.EscapeDataString(x.ToString())).ToList().Join("&");
            else
                result += b.Key + "=" + Uri.EscapeDataString(b.Value.ToString());
        }

        return result;
    }

效率不高:string.Format重复了params.Count+1次,创建了IEnumerator对象,调用了太多方法。创建匿名方法。简单地连接字符串需要做很多工作。如果你不把?在URL编码之外的部分,结果如下所示:http%3a%2f%2fwww.yoursite.com%3f。。。我会对键和值进行编码,而不做其他事情。类似这样的内容:$http://www.yoursite.com?{string.Join&,parameters.Selectkvp=>${HttpUtility.UrlEncodekvp.Key}={HttpUtility.UrlEncodekvp.Value}这是无效答案。HttpUtility.UrlEncodea=b&c=d将对“=”和“&”字符进行编码,并返回%3db%26c%3dd。正确的方法:$https://example.com?{string.Join&,parameters.Selectkvp=>${HttpUtility.UrlEncodekvp.Key}={HttpUtility.UrlEncodekvp.Value}}我认为没有必要对字典键进行url编码。我只是对值进行url编码。这对我来说很安全:string.Join&,parameters.Selectkvp=>${kvp.Key}={HttpUtility.UrlEncodekvp.Value}我显然遗漏了一些东西,因为如果你传入{abc->def,ghi->jkl},这会产生abc=&def&ghi=&jkl。@CarlosMuñoz实现细节是的,正确的实现细节。否则,它可能导致错误提示:string.Join&,parameters.Selectkvp=>${WebUtility.UrlEncodekvp.Key}={WebUtility.UrlEncodekvp.Value.ToString}@胸腺嘧啶我补充了一条评论。在我的场景中,参数已经在字典中进行了编码。为什么你认为这不是更好的选择?我认为这样更好,因为你不必自己编码这些值。这是一个小得多的解决方案。
string s = string.Join("&", dd.Select((x) => x.Key + "=" + x.Value.ToString()));
first = true;
foreach(var item in dd)
{
    if (first)
        first = false;
    else
        sb.Append('&');
    sb.Append(item.Key);
    sb.Append('=');
    sb.Append(item.Value.ToString());
}
public static string AddQueryString(this string url, IDictionary<string, object> parameters) => 
     $"{url}?{parameters.ToQueryString()}";
private static string ToQueryString(this IDictionary<string, object> parameters) => 
    string.Join("&", parameters.Select(x => $"{x.Key}={x.Value}"));
string.Join("&", parameters.Select(x => $"{x.Key}={x.Value}"));
using System.Collections.Generic;
using System.Linq;
using System.Text;

public static class CollectionExtensions {
    public static string ToQueryString(this IDictionary<string, string> dict)
    {

    if (dict.Count == 0) return string.Empty;

    var buffer = new StringBuilder();
    int count = 0;
    bool end = false;

    foreach (var key in dict.Keys)
    {
        if (count == dict.Count - 1) end = true;

        if (end)
            buffer.AppendFormat("{0}={1}", key, dict[key]);
        else
            buffer.AppendFormat("{0}={1}&", key, dict[key]);

        count++;
    }

    return buffer.ToString();
}
}
var queryString = dictionary.ToQueryString();
string url = QueryHelpers.AddQueryString("https://me.com/xxx.js", dictionary);
// this is wrong
var url = string.Format("http://www.yoursite.com?{0}",
    HttpUtility.UrlEncode(string.Join("&",
        parameters.Select(kvp =>
            string.Format("{0}={1}", kvp.Key, kvp.Value))))); 
    public static string Join(this List<string> a, string seperator)
    {
        return string.Join(seperator, a.ToArray());
    }

    public static string ToHttpQuery(this object a)
    {
        string result = "";

        foreach (var b in JObject.FromObject(a))
        {
            if (result.Length > 0)
                result += "&";

            if (b.Value.Type == JTokenType.Array)
                result += b.Value.Select(x => b.Key + "[]=" + Uri.EscapeDataString(x.ToString())).ToList().Join("&");
            else
                result += b.Key + "=" + Uri.EscapeDataString(b.Value.ToString());
        }

        return result;
    }
        string query = new
        {
            test = new string[] { "ree", "roo" },
            myId = 123,
            port = PORTS.MAIN_INTERFACE_IO,
            targetUrl = "http://example.com/?fee=123"
        }.ToHttpQuery();
        
        string myUrl = "http://example.com/?" + query;