我有几个案例,其中我有一个包含多个查询参数的页面 - 最近是一个搜索结果页面 - 并且需要创建指向同一页面的链接,并在 URL 中更改了一个或多个查询参数。这似乎是一个常见的用例,我觉得好像必须有一些简单的内置方法来做这件事。
现在,我正在使用我编写的一个函数,它接收参数和值的字典,并将它们与来自Request.QueryString
. null
删除带有值的参数。它有效,但我对更简单的方法持开放态度。
我有几个案例,其中我有一个包含多个查询参数的页面 - 最近是一个搜索结果页面 - 并且需要创建指向同一页面的链接,并在 URL 中更改了一个或多个查询参数。这似乎是一个常见的用例,我觉得好像必须有一些简单的内置方法来做这件事。
现在,我正在使用我编写的一个函数,它接收参数和值的字典,并将它们与来自Request.QueryString
. null
删除带有值的参数。它有效,但我对更简单的方法持开放态度。
我现在使用的功能:
public string ThisPageWithParams(IDictionary<string, string> newParameters)
{
string url = Request.Url.AbsolutePath + "?";
var parameters = new Dictionary<string, string>();
foreach (string k in Request.QueryString)
{
parameters[k] = Request.QueryString[k];
}
foreach (var kv in newParameters)
{
if (newParameters[kv.Key] == null)
{
parameters.Remove(kv.Key);
}
else
{
parameters[kv.Key] = kv.Value;
}
}
url += string.Join("&", parameters.Select(kv => Server.UrlEncode(kv.Key) + "=" + Server.UrlEncode(kv.Value)));
return url;
}
我建议的小改进:
//...
{
UriBuilder ub = new UriBuilder(Request.Url);
//...
ub.Query = string.Join("&", parameters.Select(kv => string.Format("{0}={1}", Server.UrlEncode(kv.Key), Server.UrlEncode(kv.Value))));
return ub.ToString();
}
编辑
实际上返回值也应该是一种Uri
类型,但我不想引入任何重大更改。