Доступ к строковым параметрам запроса без значений в ASP.NET - PullRequest
27 голосов
/ 28 июня 2010

Я пытаюсь настроить страницу, которая имеет два поведения.Я разделяю их по URL: одно поведение доступно через /some-controller/some-action, другое через /some-controller/some-action?customize.

Не похоже, что объект Request.QueryString содержит что-либо, хотя, когда я посещаю второй URL ... Я имею в виду, что в коллекции ключей есть один элемент, но это null,'customize'.У кого-нибудь есть идеи по этому поводу или как это включить.Я бы хотел избежать ручной разбора строки запроса любой ценой:).

Ответы [ 4 ]

69 голосов
/ 22 сентября 2011

Параметры без ключа

Ответ Джона Шермана является только технически правильным. Параметры запроса без значения не поддерживаются, но значения запроса без ключи поддерживаются.

Другими словами, "/some-controller/some-action?customize" считается URL-адресом с одним параметром запроса, значение которого равно "customize", и у которого нет ключа (то есть ключ null).

Получение

Чтобы получить все такие параметры запроса, вы используете Request.QueryString.GetValues(null), чтобы получить их как массив строк, или вы можете использовать Request.QueryString[null], чтобы получить их как одну строку с разделителями-запятыми.

Пустые параметры

Пустой параметр (как в "?foo=bar&&spam=eggs") будет отображаться как значение string.Empty с ключом null, как и трейлинг "&".

Например, довольно необычная строка запроса "?&" будет отображаться как два значения string.Empty, каждое из которых имеет ключ null.

Пустая строка запроса

Существует один крайний случай, который не соответствует шаблону. Это пустая, но существующая строка запроса (например, "/ some-controller / some-action?"). На основании ранее показанного шаблона он будет иметь одно значение, а именно string.Empty с ключом null. Однако в действительности это не будет иметь никаких ценностей.

26 голосов
/ 22 сентября 2011

Другая информация о параметрах запроса

Хотя эта дополнительная информация не является непосредственно частью этого вопроса, она также может оказаться полезной.

Символ Сепаратора

ASP.NET не поддерживает параметры запроса, разделенные ';', которые W3C рекомендует , которые серверы поддерживают в качестве альтернативы '&'.

Параметры, начинающиеся с "="

Параметры запроса, начинающиеся с '=', считаются имеющими ключ, который будет string.Empty. Не путайте это с ключом null. Например, "/some-controller/some-action?=baz" имеет одно значение, ключ которого string.Empty и значение baz.

Более чем один "=" Персонаж

Если имеется более одного '=' символа, ключ - это все до первого '=', а значение - после него.

Например, "/some-controller/some-action?foo=bar=baz" имеет один параметр с ключом "foo" и значением bar=baz.

Другой пример "/some-controller/some-action?eggs==spam" имеет один параметр с ключом "eggs" и значением "=spam".

Несколько параметров с одинаковым именем

Также поддерживаются несколько параметров с одним и тем же именем, как указано в моем другом ответе.

Например, если URL-адрес "/some-controller/some-action?foo=bar&foo=baz", то результатом Request.QueryString["foo"] будет `" bar, baz ".

Если вы хотите каждую строку отдельно, используйте Response.QueryString.GetValues("foo"), которая возвращает массив строк.

* * Пример тысяча сорок-девять

Считается, что следующий крайне неосуществимый URL имеет шесть параметров:
"/some-controller/some-action?=baz&foo=bar&edit&spam=eggs=ham&==&"

Это:

+--------------+--------------+
|     Key      |     Value    |
+--------------+--------------+
| string.Empty | "baz"        |
| "foo"        | "bar"        |
| null         | "edit"       |
| "spam"       | "eggs=ham"   |
| string.Empty | "="          |
| null         | string.Empty |
+--------------+--------------+    
7 голосов
/ 28 июня 2010

Вы можете проверить значение Request.Url.Query, если ?customise - единственное, что вам нужно.

1 голос
/ 28 июня 2010

ASP.NET не поддерживает определение наличия параметров строки запроса без значений, поскольку Request.QueryString["customize"] и Request.QueryString["foo"] оба null. Вам придется либо разобрать его самостоятельно, либо указать значение, например ?customize=1

...