Отримати повний рядок запиту в C # ASP.NET


79

Як програміст PHP, я звик використовувати $ _GET для отримання рядка запиту HTTP ... і якщо мені потрібен цілий рядок, є безліч способів це зробити.

Однак в ASP я не можу отримати запит.

Ось код для news.aspx (вбудований у якийсь 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);
%>

Я отримую вихідні дані PHP-скрипта з віддаленого сервера, і це чудово працює без Request.Querystring.

Проблема в тому, що я намагаюся отримати повний рядок запиту в першому рядку: Request.Querystring. Я отримую помилку " Посилання на об'єкт не встановлено як екземпляр об'єкта ", що в основному означає, що Request.Querystring не існує.

Будь-яка ідея, в чому тут проблема? Як я можу отримати цей рядок запиту, щоб, коли index.aspx називається як http://test.com/news.aspx?id=2, мій скрипт отримує http://www.example.com/rendernews.php?id=2


Чи завжди це виходить з ладу, чи є випадки краю, як відсутність змінних get, визначених?
Matt

Відповіді:



16

Це має добре працювати для вас.

Напишіть цей код у Page_Loadвипадку сторінки.

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

8

Request.QueryStringповертає вам колекцію пар ключ / значення, що представляють рядок запиту. Не струна. Не думайте, що це призведе до помилки посилання на об'єкт. Причина вашого отримання полягає в тому, що, як зазначив Мауро в коментарях. Це QueryString, а не Querystring.

Спробуйте:

Request.QueryString.ToString();

або

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

Те саме, що і ваш код, але Request.Url.AbsoluteUriповерне повний шлях, включаючи рядок запиту.


При цьому я отримую: "'System.Web.HttpRequest' не містить визначення" Querystring "і жодного методу розширення" Querystring ", що приймає перший аргумент типу" System.Web.HttpRequest "", і коли я намагаюся додати System. Перед нею я отримую "Ім'я типу або простору імен" Запит "не існує у просторі імен" System.Web "(вам не вистачає збірки?)"
Ентоні Карті

Можливо, хочете переконатися, що ви не перевизначаєте запит десь. Я щось використовую Request.Querystring [.ToString ()] у виробництві, і це працює бездоганно.
Matt

2
хіба це не QueryString, а не Querystring? код вище виглядає як c # - пам’ятайте чутливість до регістру
Mauro

1
У моєму випадку саме цього я хочу уникнути, оскільки ToString () глючить у старій версії **** .NET framework, яку я змушений використовувати.
Флоріан Зима

1

Просто використовуйте, Request.QueryString.ToString()щоб отримати повний рядок запиту, наприклад:

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

1
Це повертає назву класу.
Аллов

1
@Allov Я перевірив це, і він повернув рядок запиту правильно, і насправді навіть без .ToString () він буде працювати при конкатенації з рядком
yoel halb

Це не спрацювало в .Net 4. Можливо, це голоси за інші версії .Net.
Fabio Milheiro

1
Це насправді змінюється & for & amp; тому це робить його непридатним для використання. Request.Url.Query набагато кращий.
Jiří Herník

0

Я перевірив ваш приклад, і хоча Request.QueryString не перетворюється на рядок, ні неявний, ні явний, метод .ToString () повертає правильний результат.

Більше того, при конкатенації з рядком за допомогою оператора "+", як у вашому прикладі, він також поверне правильний результат (оскільки це поводиться так, ніби було викликано .ToString ()).

Як такий, у вашому коді немає нічого поганого, і я б припустив, що ваша проблема полягала в помилці в коді, яка писала "Querystring" замість "QueryString".

І це має більше сенсу з вашим повідомленням про помилку, оскільки якщо проблема полягає в тому, що QueryString - це колекція, а не рядок, вона повинна буде давати інше повідомлення про помилку.


-1

буквально хвилину тому я зіткнувся з тим самим питанням. і я вирішую це наступним чином.

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

з посиланням на це


1
Ніколи і ніколи не створюйте подібні URL-адреси в будь-якій структурі чи мові програмування. Використовуйте конструктори URL. Вони піклуються про кодування для вас, чого вище код не робить.
Флоріан Зима
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.