#asp.net-mvc #query-string
#asp.net-mvc #строка запроса
Вопрос:
У меня есть URL:http://site.com/page.aspx?update
как мне проверить, присутствует ли это значение обновления?
HttpValueCollection
обрабатывает это как объект с null
ключом. Я пытался:
var noKeyValues = Request.QueryString.GetValues(null);
if (noKeyValues != null amp;amp; noKeyValues.Any(v=>v==update)) ...
но это приводит меня в замешательство, потому что аргумент getValues украшен [NotNull] .
итак, я в конечном итоге делаю:
var queryValuesWithNoKey =
Request.QueryString.AllKeys.Select((key, index) => new { key, value = Request.QueryString.GetValues(index) }).Where(
item => item.key == null).Select(item => item.value).SingleOrDefault();
if (queryValuesWithNoKey != null amp;amp; queryValuesWithNoKey.Any(v => v.ToLower() == "update")) live = true;
не самое элегантное решение. Есть ли лучший способ получить значение без ключа из строки запроса?
Ответ №1:
Вы можете использовать
Request.QueryString[null]
чтобы получить разделенный запятыми список ключей без значений. Например, если ваш URL-адрес:
http://mysite/?firstamp;second
затем приведенное выше вернет
first,second
В вашем случае вы могли бы просто сделать что-то вроде:
if(Request.QueryString[null] == "update")
{
// it's an update
}
Комментарии:
1. Я все еще получаю предупреждение,
argument decorated with [NotNull]
если я не возражаю против этого — я могу также использоватьRequest.QeryString.GetValues(null)
. Интересно, является ли предупреждение необоснованным, поскольку я не вижу [NotNull] в аргументе.2. Да, я думаю то же самое. Кажется, все работает нормально, поэтому я не слишком беспокоюсь о предупреждении.
Ответ №2:
если это единственный ключ, который вы бы использовали
Запрос.Строка запроса.toString() для получения значения «обновить»
Ответ №3:
Я знаю, что опаздываю на вечеринку, но это функция, которую я использую для такого рода задач.
internal static bool HasQueryStringKey(HttpRequestBase request, string key)
{
// If there isn't a value, ASP will not recognize variable / key names.
string[] qsParts = request.QueryString.ToString().Split('amp;');
int qsLen = qsParts.Length;
for (int i = 0; i < qsLen; i )
{
string[] bits = qsParts[i].Split('=');
if (bits[0].Equals(key, StringComparison.OrdinalIgnoreCase))
{
return true;
}
}
return false;
}
Возможно, вам потребуется обновить его, чтобы он учитывал регистр или использовал разные аргументы в зависимости от ваших целей, но у меня это всегда хорошо работало.
Комментарии:
1. Я не могу говорить за плюсы и минусы этого решения, но вот его краткое изложение
return request.QueryString.ToString().Split('amp;').Select(parts => parts.Split('=')).Any(bits => bits[0].Equals(key, StringComparison.OrdinalIgnoreCase));