如何在 .NETCore 中修改 QueryString ?
咨詢區
vcsjones:
我有一個絕對路徑的 url 包含了 querystring,現在我想對 querystring 進行修改和添加,我不想生硬的用字符串提取,或者是 正則表達式,而且還有惡心的 編碼解碼 問題,所以我更希望用 .NETCore 中內建的工具提取,而且也不需要操心 escape 問題。
我知道在 Asp.NET 中有一個 HttpUtility ,但在 .NETCore 中并沒有 System.Web ,無法實現,請問我該如何處理呢?
回答區
vcsjones:
如果你用的是 ASP.NET Core 1,2 的話,可以在nuget上找一下 Microsoft.AspNetCore.WebUtilities.QueryHelpers 工具包,如果是 ASP.NET Core 3.0 以上版本, WebUtilities 已經內置到 ASP.NET SDK 了,可參考如下例子:
var?uri?=?new?Uri(context.RedirectUri); var?queryDictionary?=?Microsoft.AspNetCore.WebUtilities.QueryHelpers.ParseQuery(uri.Query);值得一提的是, 和 System.Web 下的 ParseQueryString 不同的是,ASP.NET Core 下返回的是 IDictionary<string, StringValues> ,這個 value 表示string的集合,所以當 querystring 中有多個重名時所有同名key都能提取出來。
總的來說,如果你想在 querystring 中添加參數,可以使用 QueryHelpers 。
var?parametersToAdd?=?new?System.Collections.Generic.Dictionary<string,?string>?{?{?"resource",?"foo"?}?}; var?someUrl?=?"http://www.google.com"; var?newUri?=?Microsoft.AspNetCore.WebUtilities.QueryHelpers.AddQueryString(someUrl,?parametersToAdd);如果想獲取,可以像下面這樣。
var?request?=?HttpContext.Request; var?query?=?request.Query; foreach?(var?item?in?query){Debug.WriteLine(item)? }最后會得到如下的 key:value 鍵值對。
[0]?{[companyName,?]} [1]?{[shop,?]} [2]?{[breath,?]} [3]?{[hand,?]} [4]?{[eye,?]} [5]?{[firstAid,?]} [6]?{[eyeCleaner,?]}Gabriel Luca:
我在 HttpContext 類中做了一個擴展,代碼如下:
public?static?string?AddOrReplaceQueryParameter(this?HttpContext?c,?params?string[]?nameValues){if?(nameValues.Length%2!=0){throw?new?Exception("nameValues:?has?more?parameters?then?values?or?more?values?then?parameters");}var?qps?=?new?Dictionary<string,?StringValues>();for?(int?i?=?0;?i?<?nameValues.Length;?i+=2){qps.Add(nameValues[i],?nameValues[i?+?1]);}return?c.AddOrReplaceQueryParameters(qps);}public?static?string?AddOrReplaceQueryParameters(this?HttpContext?c,?Dictionary<string,StringValues>?pvs){var?request?=?c.Request;UriBuilder?uriBuilder?=?new?UriBuilder{Scheme?=?request.Scheme,Host?=?request.Host.Host,Port?=?request.Host.Port????0,Path?=?request.Path.ToString(),Query?=?request.QueryString.ToString()};var?queryParams?=?QueryHelpers.ParseQuery(uriBuilder.Query);foreach?(var?(p,v)?in?pvs){queryParams.Remove(p);queryParams.Add(p,?v);}uriBuilder.Query?=?"";var?allQPs?=?queryParams.ToDictionary(k?=>?k.Key,?k?=>?k.Value.ToString());var?url?=?QueryHelpers.AddQueryString(uriBuilder.ToString(),allQPs);return?url;}然后像下面這樣使用。
var?next?=?Context.Request.HttpContext.AddOrReplaceQueryParameter("page",Model.PageIndex+1+"");var?prev?=?Context.Request.HttpContext.AddOrReplaceQueryParameter("page",Model.PageIndex-1+"");點評區
WebUtilities 下的 QueryHelpers 確實比較好用,學習了。
總結
以上是生活随笔為你收集整理的如何在 .NETCore 中修改 QueryString ?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用C#开发交互式命令行应用
- 下一篇: 第六届中国开源年会(COSCon'21)