Uzyskaj pełny ciąg zapytania w C # ASP.NET


79

Jako programista PHP jestem przyzwyczajony do używania $ _GET do pobierania ciągu zapytania HTTP ... a jeśli potrzebuję całego ciągu, istnieje wiele sposobów, aby to zrobić.

Jednak w ASP nie mogę uzyskać zapytania.

Oto kod dla news.aspx (osadzony w jakimś HTML):

<%                             
    string URL = "http://www.example.com/rendernews.php?"+Request.Querystring;
    System.Net.WebClient wc = new System.Net.WebClient();
    string data = wc.DownloadString(URL);
    Response.Output.Write(data);
%>

Pobieram dane wyjściowe skryptu PHP ze zdalnego serwera i działa to doskonale bez Request.Querystring.

Problem polega na tym, że próbuję uzyskać pełny ciąg zapytania w pierwszym wierszu: Request.Querystring. Otrzymuję błąd „ Odwołanie do obiektu nie jest ustawione na wystąpienie obiektu ”, co w zasadzie oznacza, że ​​Request.Querystring nie istnieje.

Masz pojęcie, na czym polega problem? Jak mogę uzyskać ten ciąg zapytania, więc gdy index.aspx nazywa się http://test.com/news.aspx?id=2, mój skrypt pobiera http://www.example.com/rendernews.php?id=2


Czy zawsze kończy się niepowodzeniem, czy też istnieją przypadki skrajne, takie jak brak zdefiniowanych zmiennych get?
Matt,

Odpowiedzi:



16

To powinno działać dobrze dla Ciebie.

Napisz ten kod w Page_Loadprzypadku strony.

string ID = Request.QueryString["id"].ToString();
Response.Redirect("http://www.example.com/rendernews.php?id=" + ID);

8

Request.QueryStringzwraca kolekcję par klucz / wartość reprezentujących ciąg zapytania. To nie jest ciąg. Nie myśl jednak, że spowodowałoby to błąd odwołania do obiektu. Powodem, dla którego to otrzymujesz, jest to, że jak zauważył Mauro w komentarzach. To QueryString, a nie Querystring.

Próbować:

Request.QueryString.ToString();

lub

<%                                 
    string URL = Request.Url.AbsoluteUri 
    System.Net.WebClient wc = new System.Net.WebClient();
    string data = wc.DownloadString(URL);
    Response.Output.Write(data);
%>

Taki sam jak kod, ale Request.Url.AbsoluteUrizwróci pełną ścieżkę, w tym ciąg zapytania.


W ten sposób otrzymuję: „„ System.Web.HttpRequest ”nie zawiera definicji„ Querystring ”ani metody rozszerzającej„ Querystring ”akceptującej pierwszy argument typu„ System.Web.HttpRequest ”” i kiedy próbuję dodać System. Przedtem w sieci Web otrzymuję komunikat „Nazwa typu lub przestrzeni nazw„ Żądanie ”nie istnieje w przestrzeni nazw„ System.Web ”(czy brakuje zestawu?)”
Antony Carthy,

Może chcesz się upewnić, że gdzieś nie zastępujesz żądania. Mam coś używającego Request.Querystring [.ToString ()] w produkcji i działa bezbłędnie.
Matt,

2
czy nie jest to QueryString, a nie Querystring? kod powyżej wygląda jak c # - pamiętaj o rozróżnianiu wielkości liter
Mauro

1
W moim przypadku jest to dokładnie to, czego chcę uniknąć, ponieważ ToString () zawiera błędy w **** starej wersji frameworka .NET, którego jestem zmuszony używać.
Florian Winter,

1

Po prostu użyj, Request.QueryString.ToString()aby uzyskać pełny ciąg zapytania, na przykład:

string URL = "http://www.example.com/rendernews.php?"+Request.Querystring.ToString();

1
Zwraca nazwę klasy.
Allov

1
@Allov Przetestowałem to i zwróciło poprawnie ciąg zapytania i faktycznie nawet bez .ToString () będzie działać po połączeniu z ciągiem
yoel halb

To nie działa w .Net 4. Możliwe, że w górę głosów są na inne wersje .Net.
Fabio Milheiro

1
W rzeczywistości zmienia się & dla & amp; więc czyni go bezużytecznym. Request.Url.Query jest znacznie lepsze.
Jiří Herník

0

Przetestowałem Twój przykład i chociaż Request.QueryString nie można zamienić na ciąg znaków ani niejawny, ani jawny, metoda .ToString () zwraca poprawny wynik.

Co więcej, w przypadku konkatenacji z łańcuchem przy użyciu operatora „+”, tak jak w naszym przykładzie, zwróci on również poprawny wynik (ponieważ zachowuje się tak, jakby wywołano .ToString ()).

W związku z tym nie ma nic złego w Twoim kodzie i sugeruję, że problem był spowodowany literówką w kodzie, w której zapisano „Querystring” zamiast „QueryString”.

Ma to większy sens w przypadku komunikatu o błędzie, ponieważ jeśli problem polega na tym, że QueryString jest kolekcją, a nie ciągiem, musiałby podać inny komunikat o błędzie.


-1

przed chwilą natknąłem się na ten sam problem. i rozwiązuję to w następujący sposób.

Response.Redirect("../index.aspx?Name="+this.textName.Text+"&LastName="+this.textlName.Text);

w odniesieniu do tego


1
Nigdy nie buduj takich adresów URL w żadnym frameworku lub języku programowania. Użyj narzędzi do tworzenia adresów URL. Zajmują się kodowaniem za Ciebie, czego nie robi powyższy kod.
Florian Winter,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.