コード内の辞書を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内では、UrlHelper(またはコントローラーのUrl)を使用してURLを生成できますが、Webフォームのコードビハインドでは、このHtmlHelperは使用できません。
string url = UrlHelper.GenerateUrl("Default", "Action", "Controller",
new RouteValueDictionary(parameters), htmlHelper.RouteCollection ,
htmlHelper.ViewContext.RequestContext, true);
これは、MVCヘルパーなしでC#Webフォームの分離コード(MVC/Webフォームアプリ内)でどのように実行できますか?
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
が不要な場合は、完全を期すために追加しました。
静的ヘルパークラスを作成します。
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
メソッドを使用することをお勧めします。
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());
}
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}"));
あなたはこれを試すことができます:
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;
私はロジックを実行していませんが、これはあなたを助けるかもしれません。
WebフォームでUrlRoutingを使用する場合は、別の話になります。
チェックアウト:
http://msdn.Microsoft.com/en-us/library/cc668201(v = vs.90).aspx
私はこれらの拡張メソッドを書きました:
ベース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}"));
編集:
本番環境で使用する場合は、この関数内でURL.Encode
を使用してパラメーターをエンコードすることを検討してください。これを使用する場合は、辞書のパラメータがまだエンコードされていないことを確認してください。
これはあなたが探しているものですか(テストされていないコード)?
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("&"));
Microsoft.AspNetCore.WebUtilitiesのQueryHelpersを使用できます。
string url = QueryHelpers.AddQueryString("https://me.com/xxx.js", dictionary);
次のクラスをプロジェクトに追加して、拡張メソッドを使用できます。
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();