2010-02-22 13 views

Odpowiedz

110

Polecam Request.QueryString["key"]. Nie ma dużej różnicy w stosunku do Request["Key"] dla ciągu zapytania, ale istnieje duża (duża) różnica, jeśli próbujesz uzyskać wartość od ServerVariables. Request["Key"] szuka wartości w QueryString, jeśli wartość jest pusta, wygląda na Form, następnie Cookie i na koniec ServerVariables.

Korzystanie z Params jest najbardziej kosztowne. Pierwsze żądanie dla params tworzy nowe NameValueCollection i dodaje do tej kolekcji każdy z QueryString, , ,Dla drugiego żądania jest bardziej wydajny niż Request["Key"].

Powiedziawszy, że różnica wydajności dla kilku kluczy jest dość pomijalna. Kluczem jest tutaj kod powinien wskazywać intencje i używanie Request.QueryString wyjaśnia, co masz zamiar.

+4

+1 za wchodzenie w szczegóły i rozumowanie – Phil

+0

Dzięki, właśnie odpowiedziałeś na moje pytanie, dlaczego wartości ciasteczek wyskakują z mojej prośby.Params [indeks] . – ProfK

+0

Wspaniale, że zauważyłeś, że nowa kolekcja NameValue jest utworzona na pierwsze połączenie, teraz mój błąd i ślad stosu ma sens :) – SwissCoder

4

Zawsze wyraźnie określam kolekcję. Jeśli z jakiegoś powodu chcesz zezwolić na przesłonięcia, zakoduj "otrzymaj" dla każdego z nich i napisz jakiś wyraźny kod, który pokazuje twoją hierarchię do wyboru jednej nad drugą. IMO, nie podoba mi się uzyskanie wartości z wielu źródeł bez wyraźnego powodu biznesowego.

21

Preferuję używać Request.QueryString["key"], ponieważ pomaga to czytnikowi kodów wiedzieć, dokładnie skąd pochodzą dane. Zwykle nie używam Request.Params["key"], ponieważ może to odnosić się do cookie, ciągu zapytania i kilku innych rzeczy; więc użytkownik musi trochę pomyśleć. Im mniej czasu ktoś potrzebuje, aby dowiedzieć się, co myślisz, tym łatwiej jest utrzymać kod.

+1

Myślę, że kwestia jest naprawdę "skąd" dane pochodzą. Dobrze jest używać 'Request.Params [" key "]' tak długo, jak długo nie obchodzi cię, czy pochodzi on z łańcucha zapytania, czy gdzieś indziej. –

+0

Jeśli wiesz, która kolekcja zawiera wartość, spójrz tam. Bezużyteczność sprawia, że ​​obiekt żądania przeszukuje wszystkie zbiory (ze względu na wydajność, jeśli nic więcej). – DaveB

+0

@Will Vousden. Niezły punkt. Twoje zdanie jest bardzo prawdziwe, kiedy po raz pierwszy piszesz kod, a pomysł jest świeży w twojej głowie. Fast-Forward dwa lata od teraz - masz paskudny błąd, kod jest bardzo owłosiony/złożony i po prostu chcesz skupić się na naprawianiu problemu! Nie musisz szukać polowania na znaczenie zmiennej wypełnionej "Żądaj.Params ["key"] "(ciąg zapytania, zmienna sesji lub coś innego) może sprawić, że rzeczy będą odrobinę łatwiejsze. Nie jest to ani wielkie, ani przerywane i zawsze możesz je wyszukać, ale takie małe rzeczy idą długo – Phil

6

HttpRequest.Params lub Request.Params dostaje prawie wszystko (kwerendy, formularza, ciasteczka i zmiennych sesyjnych) od HttpRequest, natomiast Request.Querystring tylko będzie ciągnąć ciągu kwerendy ... Wszystko zależy od tego, co robisz w danym momencie.

0

Jako uprzejmie powiadomienia Jeśli ustawisz requestValidationMode = "4.5" pod web.config, zarówno Request.QueryString [ „klucz”] i Zapytanie [ „klucz”] użyje "lazy loading" zachowanie jako projekt.

Jednak w jakiś sposób Prośba.Params ["klucz"] nadal będzie wyzwalać sprawdzanie poprawności jako zachowanie 4.0.

To dziwne zachowanie bardzo mnie martwi od dłuższego czasu.