Проверьте, существует ли неназначенная переменная в Request.QueryString

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

Например, если я загружаю свою страницу с помощью 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

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

Request.QueryString.GetValues(null).Contains("test") вернет true

Ответ 2

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

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);
}

Ответ 3

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

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

Ответ 4

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

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
}

Ответ 5

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

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

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