Проверьте, существует ли строка неопределенного запроса в URL-адресе с С#

Я видел пару примеров того, как проверить, существует ли строка запроса в URL-адресе с С#:

www.site.com/index?query=yes

if(Request.QueryString["query"]=="yes")

Но как бы проверить строку без параметра? Мне просто нужно посмотреть, существует ли он.

www.site.com/index?query

if(Request.QueryString["query"] != null) //why is this always null?

Я знаю, что, возможно, есть простой ответ, и я буду чувствовать себя глупым, но я еще не смог его найти. Спасибо!

Ответ 1

Если вы не укажете значение, ключу будет автоматически присвоено значение null, поэтому вы не сможете проверить его существование.

Чтобы проверить, существует ли значение на самом деле, вы можете проверить в коллекции значений, равных null если она содержит ваш ключ:

Request.QueryString.GetValues(null).Contains("query")

Ответ 2

Если query был включен как параметр, но значение не было указано, значение query будет равно NULL, но оно все равно будет существовать в Request.QueryString.AllKeys.

Если query не был включен, он вообще не будет существовать в Request.QueryString.AllKeys.

Ответ 3

Он возвращает null, потому что в этой строке запроса он не имеет значения для этого ключа. Я думаю, что проверка, которую вы ищете, такова:

if(Request.QueryString.Keys.OfType<string>().Any(k => k == "query"))

или даже:

if(Request.QueryString.AllKeys.Any(k => k == "query"))

Последний, вероятно, более уместен, потому что этот массив уже кэширован.

Ответ 4

это самый быстрый способ проверить это благодаря ответу Людовика

if(Request.QueryString.GetValues(null)?.Contains("query")??false)

Ответ 5

Людовик имеет правильный ответ. Но я хотел бы предложить более надежную версию.

var valueEntries = Request.QueryString.GetValues((string)null) ?? new string[] {};
if (valueEntries.Contains("query", StringComparer.OrdinalIgnoreCase))
{
    // value is specify in querystring
}
else
{
    // value is NOT specify in querystring
}

Ответ 6

Это многословие, и оно работает. Вот скрипт .NET.

@using System.Linq;

@{
    var empties = Request.Url.Query
        .Split('&')
        .Where(s => !s.Contains("=") || s.Last() == '=');

    var keyExistsAndIsEmpty = empties.Any(x => x.Contains("target-key")
}

Ответ 7

Оказывается, если значение равно null, то ключ также является нулевым в коллекции QueryString. Лучше всего просто назначить значение для запроса. Возможно, вы сможете переименовать параметр так, чтобы это создавало более смысловой смысл. Например, вместо www.site.com/index?getdocument=yes вы можете сделать www.site.com/index?action=getdocument

Однако, если вы все еще хотите, чтобы url www.site.com/index?query работал, существует способ: вообще не используйте QueryString и вручную анализируйте URL:

string query = Request.RawUrl.Split('?')[1];
if (query == "query")
{
    // send the data
}

Ответ 8

Вы не можете использовать нулевую проверку, чтобы определить, существует ли ключ, когда "=" не указан, поскольку ноль означает, что ключ не был в строке запроса.

Проблема в том, что запрос обрабатывается как значение с нулевым ключом, а не как ключ с нулевым значением.

В этом случае ключ также имеет значение null внутри Request.QueryString.AllKeys.

Я использовал этот универсальный метод, чтобы "исправить" проблему с нулевым ключом в строке запроса перед его использованием. Это не включает ручной анализ строки.

Пример использования:

var fixedQueryString = GetFixedQueryString(Request.QueryString);
if (fixedQueryString.AllKeys.Contains("query"))
{
}

Метод:

public static NameValueCollection GetFixedQueryString(NameValueCollection originalQueryString)
{
      var fixedQueryString = new NameValueCollection();

      for (var i = 0; i < originalQueryString.AllKeys.Length; i++)
      {
          var keyName = originalQueryString.AllKeys[i];

          if (keyName != null)
          {
              fixedQueryString.Add(keyName, originalQueryString[keyName]);
          }
          else
          {                       
              foreach (var keyWithoutValue in originalQueryString[i].Split(','))
              {
                  fixedQueryString.Add(keyWithoutValue, null);
              }              
          }
      }

      return fixedQueryString;
}

Ответ 9

if(Request.QueryString["query"] != null)
    // then you have no value so do whatever work needs done for that condition
else DoWork(Request.QueryString["query"].ToString(); // you have a value, do work

Ответ 10

Я предпочитаю использовать:

If(Request.QueryString.AllKeys.Contains("query")
{
    //
}