Chciałbym parsować ciąg taki jak p1=6&p2=7&p3=8
na NameValueCollection
.
Jaki jest najbardziej elegancki sposób, gdy nie masz dostępu do Page.Request
obiektu?
.net
parsing
query-string
Nathan Smith
źródło
źródło
HttpUtility.ParseQueryString
byłoby moją rekomendacją, z wyjątkiem tego, że w przypadkuHttpUtility.ParseQueryString("&X=1&X=2&X=3")
wyniku jest to, że....X=1,2,3...
posiadanie wielu parametrów o tej samej nazwie jest rzadkie, ale potrzebne do obsługi parametrów kontrolera, takich jak int [], IEnumerable <int> itp. (takich parametrów można użyć do obsługi wielu pól wyboru) patrz „Wiele wystąpień tej samej zmiennej ciągu zapytania jest skonsolidowanych w jednym wpisie” zgodnie z witryną MS . Ręcznie przygotowana wersja metody może być twoją jedyną opcjąHttpUtility.ParseQueryString będzie działać tak długo, jak jesteś w aplikacji internetowej, lub nie przeszkadza ci to zależność od System.Web. Innym sposobem na to jest:
źródło
?foo=1&bar
.HttpUtility
parsowałby to jako{ key = null, value = "bar" }
Wiele odpowiedzi zawiera niestandardowe przykłady z powodu zależności zaakceptowanej odpowiedzi od System.Web . Z pakietu Microsoft.AspNet.WebApi.Client NuGet dostępna jest metoda UriExtensions.ParseQueryString , której można również użyć:
Więc jeśli chcesz uniknąć zależności System.Web i nie chcesz tworzyć własnych, jest to dobra opcja.
źródło
Chciałem usunąć zależność od System.Web, aby móc przeanalizować ciąg zapytania wdrożenia ClickOnce, mając jednocześnie wymagania wstępne ograniczone do „podzbioru środowiska tylko dla klienta”.
Podobała mi się odpowiedź RP. Dodałem dodatkową logikę.
źródło
Potrzebowałem funkcji, która jest nieco bardziej uniwersalna niż ta, która była już dostępna podczas pracy z zapytaniami OLSC.
Oto moje rozwiązanie:
Być może nie jest to zły pomysł
<Extension()>
, aby dodać to samo, aby dodać zdolność do samego Uri.źródło
Aby to zrobić bez
System.Web
, bez samodzielnego pisania i bez dodatkowych pakietów NuGet:System.Net.Http.Formatting
using System.Net.Http;
Użyj tego kodu:
https://msdn.microsoft.com/en-us/library/system.net.http.uriextensions(v=vs.118).aspx
źródło
Jeśli chcesz uniknąć zależności od System.Web, która jest wymagana do użycia HttpUtility.ParseQueryString , możesz użyć
Uri
metody rozszerzeniaParseQueryString
znalezionej wSystem.Net.Http
.Pamiętaj, aby dodać odniesienie (jeśli jeszcze tego nie zrobiłeś) do
System.Net.Http
swojego projektu.Pamiętaj, że musisz przekonwertować treść odpowiedzi na poprawną
Uri
, abyParseQueryString
(inSystem.Net.Http
) działała.źródło
źródło
Właśnie zdałem sobie sprawę, że klient Web API ma
ParseQueryString
metodę rozszerzenia, która działa na aUri
i zwracaHttpValueCollection
:źródło
Wystarczy uzyskać dostęp do Request.QueryString. AllKeys wymienione jako kolejna odpowiedź po prostu daje ci zestaw kluczy.
źródło
HttpUtility.ParseQueryString(Request.Url.Query)
return isHttpValueCollection
(klasa wewnętrzna). Dziedziczy poNameValueCollection
.źródło
Jeśli nie chcesz zależności System.Web, po prostu wklej ten kod źródłowy z klasy HttpUtility.
Właśnie wymieszałem to z kodu źródłowego Mono . Zawiera HttpUtility i wszystkie jego zależności (takie jak IHtmlString, Helpers, HttpEncoder, HttpQSCollection).
Następnie użyj
HttpUtility.ParseQueryString
.https://gist.github.com/bjorn-ali-goransson/b04a7c44808bb2de8cca3fc9a3762f9c
źródło
Ponieważ wszyscy wydają się wklejać swoje rozwiązanie .. oto moje :-) Potrzebowałem tego z biblioteki klasowej bez
System.Web
pobierania parametrów id z przechowywanych hiperłączy.Myślałem, że podzielę się, ponieważ uważam to rozwiązanie za szybsze i lepiej wyglądające.
Stosowanie:
źródło
Hit Request.QueryString.Keys dla NameValueCollection wszystkich parametrów ciągu zapytania.
źródło
Aby uzyskać wszystkie wartości Querystring, spróbuj:
źródło
źródło
źródło
Tłumaczę na josh-brown w wersji C # w VB
źródło
To jest mój kod, myślę, że jest bardzo przydatny:
źródło