Tôi muốn phân tích một chuỗi như p1=6&p2=7&p3=8
vào mộtNameValueCollection
.
Cách thức thanh lịch nhất để làm điều này khi bạn không có quyền truy cập vào Page.Request
đối tượng là gì?
Tôi muốn phân tích một chuỗi như p1=6&p2=7&p3=8
vào mộtNameValueCollection
.
Cách thức thanh lịch nhất để làm điều này khi bạn không có quyền truy cập vào Page.Request
đối tượng là gì?
Câu trả lời:
Có một tiện ích .NET tích hợp sẵn cho việc này: HttpUtility.PudeQueryString
// C#
NameValueCollection qscoll = HttpUtility.ParseQueryString(querystring);
' VB.NET
Dim qscoll As NameValueCollection = HttpUtility.ParseQueryString(querystring)
Bạn có thể cần phải thay thế querystring
bằng new Uri(fullUrl).Query
.
HttpUtility.ParseQueryString
sẽ là đề xuất của tôi ngoại trừ trong trường hợp HttpUtility.ParseQueryString("&X=1&X=2&X=3")
kết quả là ....X=1,2,3...
Có nhiều thông số cùng tên là không phổ biến nhưng cần hỗ trợ các tham số của bộ điều khiển như int [], IEnumerable <int> etc (các thông số như vậy có thể được sử dụng để hỗ trợ nhiều hộp kiểm) xem "Nhiều lần xuất hiện của cùng một biến chuỗi truy vấn được hợp nhất trong một mục nhập" theo trang web MS . Một phiên bản thủ công của phương pháp có thể là lựa chọn duy nhất của bạn
HttpUtility.PudeQueryString sẽ hoạt động miễn là bạn đang ở trong một ứng dụng web hoặc không bận tâm bao gồm cả sự phụ thuộc vào System.Web. Một cách khác để làm điều này là:
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);
}
}
?foo=1&bar
. HttpUtility
sẽ phân tích nó như là{ key = null, value = "bar" }
Rất nhiều câu trả lời đang cung cấp các ví dụ tùy chỉnh vì sự phụ thuộc của câu trả lời được chấp nhận vào System.Web . Từ gói NuGet của Microsoft.AspNet.WebApi.Client có một phương thức UriExtensions.PudeQueryString , cũng có thể được sử dụng:
var uri = new Uri("https://stackoverflow.com/a/22167748?p1=6&p2=7&p3=8");
NameValueCollection query = uri.ParseQueryString();
Vì vậy, nếu bạn muốn tránh sự phụ thuộc của System.Web và không muốn tự mình thực hiện, đây là một lựa chọn tốt.
Tôi muốn loại bỏ sự phụ thuộc vào System.Web để tôi có thể phân tích chuỗi truy vấn của triển khai ClickOnce, trong khi có các điều kiện tiên quyết giới hạn trong "Tập hợp khung chỉ dành cho khách hàng".
Tôi thích câu trả lời của rp. Tôi đã thêm một số logic bổ sung.
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;
}
Tôi cần một chức năng linh hoạt hơn một chút so với những gì đã được cung cấp khi làm việc với các truy vấn OLSC.
Đây là giải pháp của tôi:
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
Nó có thể không phải là một ý tưởng tồi để giải quyết <Extension()>
vấn đề đó để thêm khả năng cho chính Uri.
Để thực hiện việc này mà không cần System.Web
, không cần tự viết và không có gói NuGet bổ sung:
System.Net.Http.Formatting
using System.Net.Http;
Sử dụng mã này:
new Uri(uri).ParseQueryString()
https://msdn.microsoft.com/en-us/l Library / system.net.http.uriextensions (v = vs.118) .aspx
Nếu bạn muốn tránh sự phụ thuộc vào System.Web được yêu cầu sử dụng HttpUtility.PudeQueryString , bạn có thể sử dụng Uri
phương thức tiện ích mở rộng ParseQueryString
được tìm thấy trong System.Net.Http
.
Đảm bảo thêm một tham chiếu (nếu bạn chưa có) vào System.Net.Http
vào dự án của bạn.
Lưu ý rằng bạn phải chuyển đổi nội dung phản hồi thành hợp lệ Uri
để ParseQueryString
(trong System.Net.Http
) hoạt động.
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();
private void button1_Click( object sender, EventArgs e )
{
string s = @"p1=6&p2=7&p3=8";
NameValueCollection nvc = new NameValueCollection();
foreach ( string vp in Regex.Split( s, "&" ) )
{
string[] singlePair = Regex.Split( vp, "=" );
if ( singlePair.Length == 2 )
{
nvc.Add( singlePair[ 0 ], singlePair[ 1 ] );
}
}
}
Tôi mới nhận ra rằng Web API Client có một ParseQueryString
phương thức mở rộng hoạt động trên Uri
và trả về HttpValueCollection
:
var parameters = uri.ParseQueryString();
string foo = parameters["foo"];
HttpUtility.ParseQueryString(Request.Url.Query)
trả lại là HttpValueCollection
(lớp nội bộ). Nó thừa hưởng từ NameValueCollection
.
var qs = HttpUtility.ParseQueryString(Request.Url.Query);
qs.Remove("foo");
string url = "~/Default.aspx";
if (qs.Count > 0)
url = url + "?" + qs.ToString();
Response.Redirect(url);
Tôi vừa đánh cái này từ mã nguồn của Mono . Nó chứa httpUtility và tất cả các phụ thuộc của nó (như IHtmlString, Helpers, HttpEncoder, HttpQSCollection).
Sau đó sử dụng HttpUtility.ParseQueryString
.
https://gist.github.com/bjorn-ali-goransson/b04a7c44808bb2de8cca3fc9a3762f9c
Vì mọi người dường như đang dán giải pháp của anh ấy .. đây là của tôi :-) Tôi cần điều này từ trong thư viện lớp mà không cần System.Web
tìm nạp các tham số id từ các siêu liên kết được lưu trữ.
Tôi muốn chia sẻ vì tôi thấy giải pháp này nhanh hơn và đẹp hơn.
public static class Statics
public static Dictionary<string, string> QueryParse(string url)
{
Dictionary<string, string> qDict = new Dictionary<string, string>();
foreach (string qPair in url.Substring(url.IndexOf('?') + 1).Split('&'))
{
string[] qVal = qPair.Split('=');
qDict.Add(qVal[0], Uri.UnescapeDataString(qVal[1]));
}
return qDict;
}
public static string QueryGet(string url, string param)
{
var qDict = QueryParse(url);
return qDict[param];
}
}
Sử dụng:
Statics.QueryGet(url, "id")
Nhấn lên Request.QueryString.Keys cho NameValueCollection của tất cả các tham số chuỗi truy vấn.
Để nhận tất cả các giá trị chuỗi truy vấn, hãy thử điều này:
Dim qscoll As NameValueCollection = HttpUtility.ParseQueryString(querystring)
Dim sb As New StringBuilder("<br />")
For Each s As String In qscoll.AllKeys
Response.Write(s & " - " & qscoll(s) & "<br />")
Next s
var q = Request.QueryString;
NameValueCollection qscoll = HttpUtility.ParseQueryString(q.ToString());
let search = window.location.search;
console.log(search);
let qString = search.substring(1);
while(qString.indexOf("+") !== -1)
qString = qString.replace("+", "");
let qArray = qString.split("&");
let values = [];
for(let i = 0; i < qArray.length; i++){
let pos = qArray[i].search("=");
let keyVal = qArray[i].substring(0, pos);
let dataVal = qArray[i].substring(pos + 1);
dataVal = decodeURIComponent(dataVal);
values[keyVal] = dataVal;
}
Tôi dịch sang phiên bản C # của josh-brown trong VB
private System.Collections.Specialized.NameValueCollection ParseQueryString(Uri uri)
{
var result = new System.Collections.Specialized.NameValueCollection(4);
var query = uri.Query;
if (!String.IsNullOrEmpty(query))
{
var pairs = query.Substring(1).Split("&".ToCharArray());
foreach (var pair in pairs)
{
var parts = pair.Split("=".ToCharArray(), 2);
var name = System.Uri.UnescapeDataString(parts[0]);
var value = (parts.Length == 1) ? String.Empty : System.Uri.UnescapeDataString(parts[1]);
result.Add(name, value);
}
}
return result;
}
Đây là mã của tôi, tôi nghĩ nó rất hữu ích:
public String GetQueryString(string ItemToRemoveOrInsert = null, string InsertValue = null )
{
System.Collections.Specialized.NameValueCollection filtered = new System.Collections.Specialized.NameValueCollection(Request.QueryString);
if (ItemToRemoveOrInsert != null)
{
filtered.Remove(ItemToRemoveOrInsert);
if (!string.IsNullOrWhiteSpace(InsertValue))
{
filtered.Add(ItemToRemoveOrInsert, InsertValue);
}
}
string StrQr = string.Join("&", filtered.AllKeys.Select(key => key + "=" + filtered[key]).ToArray());
if (!string.IsNullOrWhiteSpace(StrQr)){
StrQr="?" + StrQr;
}
return StrQr;
}