2010-08-10 2 views

ответ

13

Request["id"] получает значение из QueryString, Form, Cookies или ServerVariables коллекций. Порядок, в котором они выполняются поиск, не указан в документации, но если вы посмотрите на исходный код, вы увидите, что это порядок, в котором они указаны.

Итак, если вы знаете, где находится ваша переменная, что вы обычно делаете, лучше использовать более конкретный вариант.

+0

-1 от меня, потому что теперь, как и документации * не * указать порядок, в котором доступ к коллекции ,Если документы соответствуют реализации, это просто удача, как я заметил в своем ответе, это может измениться. Удалите «в этом порядке», и я буду более чем счастлив удалить удаленный -1 =) – Rob

+0

-1, есть еще немного документации по адресу http://msdn.microsoft.com/en-us/library/ms524948 % 28VS.90% 29.aspx (спасибо @John за его ответ, указав его), что указывает на то, что коллекции просматриваются в определенном порядке. Было бы неплохо, если бы MS упомянула, что в документации, специально предназначенной для Request.Item, да! : -/ – Rob

+1

Я удалил часть «в этом порядке», потому что это недокументировано. Однако, глядя на исходный код, вы увидите, что он использует указанный порядок. Но вы правы, это деталь реализации :) –

1

Request.QueryString["id"] возвратит значение элемента в строке запроса, который имеет ключ id, тогда как Request["id"] будет возвращать элемент из одного из Request.QueryString, Request.Form, Request.Cookies или Request.ServerVariables.

Стоит отметить, что documentation для Request.Item (который является то, что вы на самом деле доступ, когда вы звоните Request["id"]) делает не определить порядок, в котором будет осуществляться поиск коллекции, так что вы могли бы теоретически получить различный результат в зависимости на какой версии asp.net вы работаете.

Если вы знаете , что значение, которое вы хотите, в строке запроса, это всегда лучше использовать Request.QueryString["id"] для доступа к нему, а не Request["id"].

1

Согласно documentationHttpRequest индексатор

строки запроса, форма, сбор печенье или ServerVariables член , указанный в параметре ключа.

Я бы предпочел использовать Request.QueryString["id"], поскольку он более ясен, откуда исходит значение.

1

Request.QueryString ["id"] просматривает коллекцию, переданную за QueryString. Request.Item ["id"] просматривает все коллекции (QueryString, Form, Cookies или ServerVariables). Поэтому свойство QueryString должно быть предпочтительным, когда это возможно, потому что оно меньше.

3

Коллекция запросов представляет собой надстройку QueryString, а также некоторые данные, относящиеся к текущему запросу.

, так что для «лучшего» - я бы посоветовал вам быть точным и явным (т. Е. Использовать QueryString), чтобы избежать фактора сюрприза, когда вы получаете неожиданные результаты, чтобы понять, что вы использовали ключ, для которого данный запрос не предоставил значение строки запроса, но он существует в какой-либо другой коллекции.

+0

+1 для ответа на весь вопрос. Я, конечно, видел, что код запутывается, когда что-то заканчивается тем, что он читается из файлов cookie вместо querystring. –

1

Согласно Reflector.Net, запрос [ «ID»] определяется как:

public string this[string key] 
{ 
    get 
    { 
     string str = this.QueryString[key]; 
     if (str != null) 
     { 
      return str; 
     } 
     str = this.Form[key]; 
     if (str != null) 
     { 
      return str; 
     } 
     HttpCookie cookie = this.Cookies[key]; 
     if (cookie != null) 
     { 
      return cookie.Value; 
     } 
     str = this.ServerVariables[key]; 
     if (str != null) 
     { 
      return str; 
     } 
     return null; 
    } 
} 
+0

Вы полагаетесь на деталь реализации здесь ... – Rob

+0

@Rob В отличие от использования документации. Который бы вы доверили? :) – bzlm

+0

@bzlm, порядок поиска * недокументирован *, поэтому полагаться на это неразумно, в лучшем случае, потенциально катастрофический в худшем случае. Если что-то не задокументировано, вы должны предположить, что оно может быть изменено в любой точке *. – Rob