ASP.Net MVC: получение значений запроса без ключа

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