2013-02-15 5 views
17

В контексте страницы ASP.NET я могу использовать Request.QueryString для получения коллекции пар ключ/значение в части строки запроса в URI.Проверьте, существует ли неназначенная переменная в Request.QueryString

Например, если я загружаю свою страницу с помощью http://local/Default.aspx?test=value, то я могу назвать следующий код:

//http://local/Default.aspx?test=value 

protected void Page_Load(object sender, EventArgs e) 
{ 
    string value = Request.QueryString["test"]; // == "value" 
} 

В идеале, что я хочу сделать, это проверить, если тест вообще существует, так Я могу вызвать страницу с помощью http://local/Default.aspx?test и получить логическое сообщение о том, существует ли тест в строке запроса. Что-то вроде этого:

//http://local/Default.aspx?test 

protected void Page_Load(object sender, EventArgs e) 
{ 
    bool testExists = Request.QueryString.HasKey("test"); // == True 
} 

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

Я полагаю, что я мог бы просто использовать регулярное выражение, чтобы проверить строку, но мне было любопытно, было ли у кого-то более элегантное решение.

Я попытался следующие:

//http://local/Default.aspx?test 

Request.QueryString.AllKeys.Contains("test"); // == False (Should be true) 
Request.QueryString.Keys[0];     // == null (Should be "test") 
Request.QueryString.GetKey(0);    // == null (Should be "test") 

Это поведение отличается от PHP, например, где я могу просто использовать

$testExists = isset($_REQUEST['test']); // == True 
+1

Почему вы не можете просто проверить «нуль»? 'If ​​(Request.QueryString [" test "]! = Null)' – JonH

+1

@JonH: Поскольку 'Request.QueryString [" test "]' возвращает 'null', существует ли тест в строке запроса или нет. –

+0

ха? Я не уверен, что вы имеете в виду, он вернет == null, если он не видит тест в строке запроса, иначе он вернется! = Null, и если это так, вы можете получить значение теста. Я не вижу проблемы. – JonH

ответ

25

Request.QueryString.GetValues(null) получит список ключей, без значений

Request.QueryString.GetValues(null).Contains("test") возвращает истину

+1

Вы просто избили меня на несколько секунд :-) Мне пришлось заглянуть в исходный код, чтобы обнаружить это любопытное поведение. –

+0

Я получаю ошибку 'System.ArgumentNullException: Значение не может быть null.' с этим. – Dementic

+0

Я также получаю сообщение об ошибке System.ArgumentNullException: значение не может быть нулевым. – tkahn

2

Request.QueryString является NameValueCollection, но элементы добавляются только к нему, если строка запроса находится в обычном формате [name=value]*. Если нет, он пуст.

Если ваш QueryString имеет форму ?test=value, то Request.QueryString.AllKeys.Contains("test") будет делать то, что вы хотите. В противном случае вы выполняете строковые операции на Request.Url.Query.

5

Я написал метод расширения для решения этой задачи:

public static bool ContainsKey(this NameValueCollection collection, string key) 
{ 
    if (collection.AllKeys.Contains(key)) 
     return true; 

    // ReSharper disable once AssignNullToNotNullAttribute 
    var keysWithoutValues = collection.GetValues(null); 
    return keysWithoutValues != null && keysWithoutValues.Contains(key); 
} 
+0

+1 отличный ответ. Начиная с R # 8 вам больше не нужен подсказка disable, кажется, что они обновили свой анализ 'GetValues ​​(null)'. Еще одна вещь, которую я могу указать, не забывайте о перегрузке ' Содержит (key, StringComparer.OrdinalIgnoreCase) ', чтобы избежать чувствительности к регистру. –

-1
Request.QueryString.ToString().Contains("test") 

Это работает в специальный случай, когда вы ищете один параметр querystring, например MyFile.aspx?test

Для более сложных, общих случаев, тогда другие решения были бы лучше.

+1

Хммм ... он может работать, но он не очень надежный, он не пройдет достойный модульный тест. Принятый ответ по-прежнему остается лучшим. посмотрите, содержит ли строка запроса переменную, называемую 'test' (независимо от того, содержит ли она значение, например:'? test' или '? test = anyvalue', возвращают' true'). Проверка, чтобы проверить, ' существует * где угодно * в querystring может создавать ложные срабатывания. Например: '? A = test' - имя переменной' a', и это не то, что я ищу. Также '? Bestest = 10' создаст ложный результат. –

+0

Хорошая точка, хотя для моего варианта использования все было в порядке. Я предполагаю, что можно было бы выкинуть регулярное выражение в исходном querystring. – GlennG

+1

Пример regex: (? GlennG

2

Я использую это.

if (Request.Params["test"] != null) 
{ 
    //Is Set 
} 
else if(Request.QueryString.GetValues(null) != null && 
     Array.IndexOf(Request.QueryString.GetValues(null),"test") > -1) 
{ 
    //Not set 
} 
else 
{ 
    //Does not exist 
} 
Смежные вопросы