Ответ 1
Request.QueryString.GetValues(null)
получит список ключей без значений
Request.QueryString.GetValues(null).Contains("test")
вернет true
В контексте страницы 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
Request.QueryString.GetValues(null)
получит список ключей без значений
Request.QueryString.GetValues(null).Contains("test")
вернет true
Я написал метод расширения для решения этой задачи:
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);
}
Request.QueryString
- это NameValueCollection
, но элементы добавляются к нему только в том случае, если строка запроса находится в обычном формате [name=value]*
. Если нет, он пуст.
Если ваш QueryString
имеет форму ?test=value
, то Request.QueryString.AllKeys.Contains("test")
будет делать то, что вы хотите. В противном случае вы выполняете строковые операции на Request.Url.Query
.
Я использую это.
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
}
Request.QueryString.ToString().Contains("test")
Это работает в специальном случае, когда вы ищете один параметр querystring, например. MyFile.aspx?test
Для более сложных, общих случаев, тогда были бы лучше другие решения.