2010-02-22 9 views

risposta

110

Suggerisco Request.QueryString["key"]. Non c'è molta differenza per Request["Key"] per una stringa di query ma c'è una grande differenza (er) se stai cercando di ottenere il valore da ServerVariables. Request["Key"] cerca un valore in QueryString se null, guarda Form, quindi Cookie e infine ServerVariables.

L'utilizzo di Params è il più costoso. La prima richiesta di params crea un nuovo NameValueCollection e aggiunge ciascuno di questo QueryString, Form, Cookie e ServerVariables a questa raccolta. Per la seconda richiesta è più performante di Request["Key"].

Detto questo, la differenza di prestazioni per un paio di chiavi è piuttosto trascurabile. La chiave qui è il codice dovrebbe mostrare l'intenzione e l'utilizzo di Request.QueryString rende chiaro quale sia il tuo intento.

+4

+1 per entrare nei dettagli e avere un senso – Phil

+0

Grazie, hai appena risposto alla mia domanda sul motivo per cui i valori dei cookie stanno saltando fuori dal mio Request.Params [indice] – ProfK

+0

Grande che hai notato che un nuovo NameValueCollection è stato creato su prima chiamata, ora il mio errore e la traccia dello stack ha senso :) – SwissCoder

4

Specifica sempre la raccolta. Se per qualche motivo vuoi consentire l'override, codifica il "get" per ognuno e scrivi del codice chiaro che mostra la tua gerarchia per la scelta dell'uno sull'altro. IMO, non mi piace ottenere un valore da più fonti senza una ragione aziendale chiara per farlo.

21

Preferisco utilizzare Request.QueryString["key"] perché aiuta il lettore di codice a conoscere esattamente da da dove si ricevono i dati. Tendo a non utilizzare Request.Params["key"] perché potrebbe fare riferimento a un cookie, una stringa di query e alcune altre cose; quindi l'utente deve pensare un po '. Quanto meno tempo qualcuno ha bisogno di capire cosa stai pensando, tanto più facile è mantenere il codice.

+1

Penso che il problema sia davvero "da dove" provengono i dati. Va bene usare 'Request.Params [" key "]' finché non ti importa se proviene dalla stringa di query o da qualche altra parte. –

+0

Se sai in quale raccolta è contenuto il valore, guarda lì. Non serve a fare in modo che l'oggetto Request cerchi tutte le raccolte (per motivi di prestazioni se non altro). – DaveB

+0

@Will Vousden. Bel punto. Il tuo punto è molto vero quando scrivi per la prima volta il codice e l'idea è fresca nella tua testa. Avanti veloce tra due anni: hai un brutto bug, il codice è molto peloso/complesso e vuoi concentrarti solo sulla risoluzione del problema! Non dover cacciare per il significato di una variabile popolata con "Richiesta".Params ["key"] "(stringa di query, variabile di sessione o qualcos'altro) può rendere le cose un po 'più semplici: non è enorme o make-or-break e puoi sempre guardarlo, ma piccole cose come quella vanno un po' – Phil

6

HttpRequest.Params o Request.Params ottiene quasi tutto (querystring, la forma, biscotto e variabili di sessione) dal HttpRequest, mentre Request.Querystring solo tirerà querystring ... tutto dipende da cosa si sta facendo in quel momento.

0

Come un avviso gentilmente, se si imposta requestValidationMode = "4.5" sotto web.config, sia Request.QueryString [ “chiave”] e Richiedi [ “chiave”] userà "lazy loading" comportamento come design.

Tuttavia, in qualche modo Request.Params ["chiave"] attiverà comunque la convalida come comportamento di 4.0.

Questo strano comportamento mi confonde molto a lungo.

Problemi correlati