我有一组类似于下面列表中的url
http://somesite.example/backup/lol.php?id=1&server=4&location=us
http://somesite.example/news.php?article=1&lang=en
我已经设法获得查询字符串使用以下代码:
myurl = longurl.Split('?');
NameValueCollection qs = HttpUtility.ParseQueryString(myurl [1]);
foreach (string lol in qs)
{
// results will return
}
但它只返回参数
id、服务器、位置等等,基于所提供的URL。
我需要的是向现有的查询字符串添加/追加值。
例如,使用URL:
http://somesite.example/backup/index.php?action=login&attempts=1
我需要改变查询字符串参数的值:
操作 = 登录 1
尝试= 11
如您所见,我为每个值附加了“1”。我需要从一个字符串中获得一组url,其中包含不同的查询字符串,并在末尾为每个参数添加一个值&再次将它们添加到列表中。
注意,你可以添加微软的Microsoft. aspnetcore . webutilities nuget包,然后用它来附加值到查询字符串:
QueryHelpers.AddQueryString(longurl, "action", "login1")
QueryHelpers.AddQueryString(longurl, new Dictionary<string, string> { { "action", "login1" }, { "attempts", "11" } });
结束了所有URL查询字符串编辑的麻烦
在对Uri类和其他解决方案进行了大量的辛劳和摆弄之后,下面是我的字符串扩展方法来解决我的问题。
using System;
using System.Collections.Specialized;
using System.Linq;
using System.Web;
public static class StringExtensions
{
public static string AddToQueryString(this string url, params object[] keysAndValues)
{
return UpdateQueryString(url, q =>
{
for (var i = 0; i < keysAndValues.Length; i += 2)
{
q.Set(keysAndValues[i].ToString(), keysAndValues[i + 1].ToString());
}
});
}
public static string RemoveFromQueryString(this string url, params string[] keys)
{
return UpdateQueryString(url, q =>
{
foreach (var key in keys)
{
q.Remove(key);
}
});
}
public static string UpdateQueryString(string url, Action<NameValueCollection> func)
{
var urlWithoutQueryString = url.Contains('?') ? url.Substring(0, url.IndexOf('?')) : url;
var queryString = url.Contains('?') ? url.Substring(url.IndexOf('?')) : null;
var query = HttpUtility.ParseQueryString(queryString ?? string.Empty);
func(query);
return urlWithoutQueryString + (query.Count > 0 ? "?" : string.Empty) + query;
}
}