我没有Request
,我只有一个网址字符串。此外,URL可以是相对的也可以是绝对的。由于Uri和UriBuilder不支持相对网址,我可能不得不手动执行,除非有一个我不知道的技巧。这个方法可能会在我的项目中使用超过一千行代码,这就是为什么我想要做正确的。
如果传递了相对网址,以下代码将会中断:
public static string AddQueryStringIfNotExists(string url, string parameter, string value)
{
var uriBuilder = new UriBuilder(url);
var query = HttpUtility.ParseQueryString(uriBuilder.Query);
if (query[parameter] == null)
{
query[parameter] = value;
uriBuilder.Query = query.ToString();
}
return uriBuilder.ToString();
}
P.S。通过检查我的参数是否出现在第一个?
之后但我需要处理几个边缘情况,我试图避免的事情(如另一个参数中包含的参数名称)< / p>
答案 0 :(得分:1)
可以有一个简单的帮助器,它将相对URL转换为绝对值:
public static string ToAbsoluteUrl(this string url, string domain)
{
var result = url.StartsWith("http", StringComparison.OrdinalIgnoreCase) ? url : domain + url;
return result;
}
url = "/page?skip=0";
url = url.ToAbsoluteUrl("https://example.com"); // https://example.com/page?skip=0
var uriBuilder = new UriBuilder(url);
答案 1 :(得分:1)
只需检查您的网址是否绝对。如果它没有将其转换为绝对URL。
然后使用HttpUtility.ParseQueryString
解析查询字符串并根据需要添加参数。
将UriBuilder转换回Uri。
如果输入是绝对的Uri则返回整个Uri。如果输入是相对的,则返回相对uri。
private static Uri dummy = new Uri("http://dummy/");
public static string AddQueryStringIfNotExists(string url, string parameter, string value)
{
var uri = new Uri(url, UriKind.RelativeOrAbsolute);
var uriBuilder = uri.IsAbsoluteUri ? new UriBuilder(url) : new UriBuilder(new Uri(dummy, url));
var query = HttpUtility.ParseQueryString(uriBuilder.Query);
if (query[parameter] == null)
{
query[parameter] = value;
uriBuilder.Query = query.ToString();
}
return uri.IsAbsoluteUri ? uriBuilder.ToString() : dummy.MakeRelativeUri(new Uri(uriBuilder.ToString())).ToString();
}
示例:
string s = AddQueryStringIfNotExists("somedirectory/mypage/html?something=1", "somethingelse", "1");
输出:
somedirectory /我的空间/ HTML东西= 1&安培; somethingelse = 1