Преобразовать словарь в строку параметров URL?

Есть ли способ конвертировать словарь в код в строку параметров 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();

Внутри MVC HtmlHelpers вы можете создавать URL-адреса с помощью UrlHelper (или Url в контроллерах), но в коде Web Forms - за этим HtmlHelper недоступен.

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

Как это можно сделать в коде С# Web Forms позади кода (в приложении MVC/Web Forms) без помощника MVC?

Ответ 1

Один из подходов:

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

И вы можете избавиться от UrlEncode, если он вам не нужен, я просто добавил его для полноты.

Ответ 2

Сделайте статический вспомогательный класс, возможно:

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);
}

Ответ 3

самый короткий путь:

string s = string.Join("&", dd.Select((x) => x.Key + "=" + x.Value.ToString()));

Но короче это не означает большей эффективности. Лучше использовать метод StringBuilder и Append:

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());
}

Ответ 4

Вы можете использовать IEnumerable<string> и String.Join:

var parameters = new List<string>();
foreach (var item in List)
{
    parameters.Add(item.Name + "=" + item.Value.ToString());
}

string url = "http://www.somesite.com?" + String.Join("&", parameters);

или короче

string baseUri = "http://www.somesite.com?";
string url = baseUri + String.Join("&", list.Select(i => $"{i.Name}={i.Value}"));

Ответ 5

Это то, что вы ищете (непроверенный код)?

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("&"));

Ответ 6

Вы можете попробовать следующее:

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;

Я не запускал логику, но это могло бы помочь вам.

Если бы вы были UrlRouting в webforms, тогда это была бы другая история.

Отъезд:

http://msdn.microsoft.com/en-us/library/cc668201 (v = vs .90).aspx

Ответ 7

Я написал эти методы расширений:

Добавить запрос на базовый URL:

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}"));

Ответ 8

Вы можете добавить в проект следующий класс и использовать метод расширения.

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();