나는 같은 문자열을 구문 분석하고 싶습니다 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
.
답변
HttpUtility.ParseQueryString은 웹 응용 프로그램에 있거나 System.Web에 대한 종속성을 포함하지 않는 한 작동합니다. 이를 수행하는 다른 방법은 다음과 같습니다.
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("https://stackoverflow.com/a/22167748?p1=6&p2=7&p3=8");
NameValueCollection query = uri.ParseQueryString();
따라서 System.Web 종속성 을 피하고 직접 롤링하지 않으려는 경우 좋은 옵션입니다.
답변
전제 조건을 “클라이언트 전용 프레임 워크 하위 집합”으로 제한하면서 ClickOnce 배포의 쿼리 문자열을 구문 분석 할 수 있도록 System.Web에 대한 종속성을 제거하려고했습니다.
나는 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 쿼리로 작업 할 때 이미 제공된 것보다 조금 더 다양한 기능이 필요했습니다.
- 값은 여러 등호를 포함 할 수 있습니다
- 이름과 값 모두로 인코딩 된 문자 디코딩
- 클라이언트 프레임 워크에서 실행할 수 있음
- 모바일 프레임 워크에서 실행할 수 있습니다.
내 해결책은 다음과 같습니다.
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
<Extension()>
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
답변
HttpUtility.ParseQueryString 을 사용해야하는 System.Web에 대한 종속성을 피하려면에서 찾은 Uri
확장 메소드를 사용할 수 있습니다.ParseQueryString
System.Net.Http
.
아직 참조를 추가하지 않은 경우 참조를 추가하십시오 System.Net.Http
프로젝트에 .
참고 유효한에 응답 본문을 변환 할 필요가 있다는 Uri
정도로 ParseQueryString
(에이 System.Net.Http
) 작동합니다.
string body = "value1=randomvalue1&value2=randomValue2";
// "http://localhost/query?" is added to the string "body" in order to create a valid Uri.
string urlBody = "http://localhost/query?" + body;
NameValueCollection coll = new Uri(urlBody).ParseQueryString();