将Dictionary转换为url参数字符串?

lko*_*lko 16 c# asp.net-mvc dictionary webforms

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

例如

// An example list of parameters
Dictionary<string, object> parameters ...;
foreach (Item in List)
{
    parameters.Add(Item.Name, Item.Value);
}

string url = "http://www.somesite.com?" + parameters.XX.ToString();
Run Code Online (Sandbox Code Playgroud)

在MVC HtmlHelpers内部,您可以使用UrlHelper(或控制器中的Url)生成URL,但在Web窗体代码隐藏中,此HtmlHelper不可用.

string url = UrlHelper.GenerateUrl("Default", "Action", "Controller", 
    new RouteValueDictionary(parameters), htmlHelper.RouteCollection , 
    htmlHelper.ViewContext.RequestContext, true);
Run Code Online (Sandbox Code Playgroud)

如果没有MVC助手,如何在C#Web窗体代码隐藏(在MVC/Web窗体应用程序中)中完成?

Mik*_*oud 47

一种方法是:

var url = HttpUtility.UrlEncode(
    string.Format("http://www.yoursite.com?{0}",
        string.Join("&",
            parameters.Select(kvp =>
                string.Format("{0}={1}", kvp.Key, kvp.Value)))));
Run Code Online (Sandbox Code Playgroud)

你可以摆脱UrlEncode它,如果你不需要它,我只是为了完整性而添加它.

  • 这是无效的答案。`HttpUtility.UrlEncode("a=b&amp;c=d")` 将编码 '=' 和 '&amp;' 字符并返回 `"a%3db%26c%3dd"`。正确方法:`$"https://example.com?{string.Join("&amp;",parameters.Select(kvp =&gt; $"{HttpUtility.UrlEncode(kvp.Key)}={HttpUtility.UrlEncode(kvp.值)}"))}"` (5认同)
  • 我认为没有必要对字典Key进行url编码。我只是对值进行 url 编码。这对我来说是安全的: string.Join("&amp;",parameters.Select(kvp =&gt; $"{kvp.Key}={HttpUtility.UrlEncode(kvp.Value)}")) (3认同)
  • 如果不放http://www.yoursite.com?UrlEncode之外的部分,结果将如下所示:http%3a%2f%2fwww.yoursite.com%3f ...我将对键和值进行编码,仅此而已。这样的东西:$“ http://www.yoursite.com?{string.Join(”&“,parameters.Select(kvp =&gt; $” {HttpUtility.UrlEncode(kvp.Key)} = {HttpUtility.UrlEncode( kvp.Value)}“))}” (2认同)

Shi*_*mmy 15

我并不是说这个选项更好(我个人认为不是),但我在这里只是想说它存在。

班上QueryBuilder

var queryStringDictionary = new Dictionary<string, string>
{
    { "username", "foo" },
    { "password", "bar" }
};

var queryBuilder = new QueryBuilder(queryStringDictionary);
queryBuilder.Add("type", "user");

//?username=foo&password=bar&type=user
QueryString result = queryBuilder.ToQueryString();
Run Code Online (Sandbox Code Playgroud)

  • 为什么您认为这不是更好的选择?我认为这更好,因为您不必自己对值进行编码。这是一个小得多的解决方案。 (2认同)

小智 13

您可以使用 Microsoft.AspNetCore.WebUtilities 中的 QueryHelpers:

string url = QueryHelpers.AddQueryString("https://me.com/xxx.js", dictionary);
Run Code Online (Sandbox Code Playgroud)


Juh*_*gas 10

或许创建一个静态助手类:

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);
}
Run Code Online (Sandbox Code Playgroud)


Sta*_* BZ 5

最短的方式:

string s = string.Join("&", dd.Select((x) => x.Key + "=" + x.Value.ToString()));
Run Code Online (Sandbox Code Playgroud)

但更短并不意味着更高的效率.更好的使用StringBuilderAppend方法:

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());
}
Run Code Online (Sandbox Code Playgroud)