Проверьте, существует ли строка неопределенного запроса в 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")
{
//
}