我想解析一个字符串,如p1=6&p2=7&p3=8
一个NameValueCollection
.
当您无法访问该Page.Request
对象时,最优雅的方法是什么?
这里有一个内置的.NET实用程序: HttpUtility.ParseQueryString
// C#
NameValueCollection qscoll = HttpUtility.ParseQueryString(querystring);
' VB.NET
Dim qscoll As NameValueCollection = HttpUtility.ParseQueryString(querystring)
您可能需要更换querystring
用new Uri(fullUrl).Query
.
只要您在Web应用程序中,或者不介意包含对System.Web的依赖,HttpUtility.ParseQueryString就可以正常工作.另一种方法是:
NameValueCollection queryParameters = new NameValueCollection(); string[] querySegments = queryString.Split('&'); foreach(string segment in querySegments) { string[] parts = segment.Split('='); if (parts.Length > 0) { string key = parts[0].Trim(new char[] { '?', ' ' }); string val = parts[1].Trim(); queryParameters.Add(key, val); } }
很多答案都提供自定义示例,因为接受的答案依赖于System.Web.从Microsoft.AspNet.WebApi.Client NuGet包中有一个UriExtensions.ParseQueryString方法,也可以使用:
var uri = new Uri("/sf/ask/17360801/?p1=6&p2=7&p3=8"); NameValueCollection query = uri.ParseQueryString();
因此,如果您想避免使用System.Web依赖项并且不想自己推送,那么这是一个不错的选择.
我想删除对System.Web的依赖,以便我可以解析ClickOnce部署的查询字符串,同时将先决条件限制为"仅客户端框架子集".
我喜欢rp的答案.我添加了一些额外的逻辑.
public static NameValueCollection ParseQueryString(string s) { NameValueCollection nvc = new NameValueCollection(); // remove anything other than query string from url if(s.Contains("?")) { s = s.Substring(s.IndexOf('?') + 1); } foreach (string vp in Regex.Split(s, "&")) { string[] singlePair = Regex.Split(vp, "="); if (singlePair.Length == 2) { nvc.Add(singlePair[0], singlePair[1]); } else { // only one key with no value specified in query string nvc.Add(singlePair[0], string.Empty); } } return nvc; }
我需要的功能比使用OLSC查询时提供的功能更加通用.
值可能包含多个等号
解码名称和值中的编码字符
能够在Client Framework上运行
能够在Mobile Framework上运行.
这是我的解决方案:
Public Shared Function ParseQueryString(ByVal uri As Uri) As System.Collections.Specialized.NameValueCollection Dim result = New System.Collections.Specialized.NameValueCollection(4) Dim query = uri.Query If Not String.IsNullOrEmpty(query) Then Dim pairs = query.Substring(1).Split("&"c) For Each pair In pairs Dim parts = pair.Split({"="c}, 2) Dim name = System.Uri.UnescapeDataString(parts(0)) Dim value = If(parts.Length = 1, String.Empty, System.Uri.UnescapeDataString(parts(1))) result.Add(name, value) Next End If Return result End Function
为了增加Uri本身的能力,也可能不是一个坏主意.
要做到这一点System.Web
,没有自己编写,没有额外的NuGet包:
添加引用 System.Net.Http.Formatting
加 using System.Net.Http;
使用此代码:
new Uri(uri).ParseQueryString()
https://msdn.microsoft.com/en-us/library/system.net.http.uriextensions(v=vs.118).aspx