Parametry deklaratywne (VB)
Autor: Scott Mitchell
W tym samouczku zilustrujemy sposób użycia parametru ustawionego na wartość zakodowaną w celu wybrania danych do wyświetlenia w kontrolce DetailsView.
Wprowadzenie
W ostatnim samouczku przyjrzeliśmy się wyświetlaniu danych za pomocą kontrolek GridView, DetailsView i FormView powiązanych z kontrolką ObjectDataSource, która wywołała GetProducts()
metodę z ProductsBLL
klasy. Metoda GetProducts()
zwraca silnie typizowana tabelę DataTable wypełniona wszystkimi rekordami z tabeli bazy danych Products
Northwind. Klasa ProductsBLL
zawiera dodatkowe metody zwracania tylko podzestawów produktów — GetProductByProductID(productID)
, GetProductsByCategoryID(categoryID)
i GetProductsBySupplierID(supplierID)
. Te trzy metody oczekują parametru wejściowego wskazującego, jak filtrować zwrócone informacje o produkcie.
Obiekt ObjectDataSource może służyć do wywoływania metod, które oczekują parametrów wejściowych, ale w tym celu musimy określić, skąd pochodzą wartości tych parametrów. Wartości parametrów mogą być zakodowane trwale lub mogą pochodzić z różnych źródeł dynamicznych, w tym: wartości ciągu zapytania, zmiennych sesji, wartości właściwości kontrolki sieci Web na stronie lub innych.
Na potrzeby tego samouczka zacznijmy od zilustrowania sposobu użycia parametru ustawionego na wartość zakodowaną. W szczególności przyjrzymy się dodaniu kontrolki DetailsView do strony, która wyświetla informacje o konkretnym produkcie, a mianowicie Chef Anton's Gumbo Mix, który ma ProductID
wartość 5. Następnie zobaczymy, jak ustawić wartość parametru na podstawie kontrolki sieci Web. W szczególności użyjemy kontrolki TextBox, aby umożliwić użytkownikowi wpisanie w kraju/regionie, po którym można kliknąć przycisk, aby wyświetlić listę dostawców, którzy znajdują się w tym kraju/regionie.
Używanie zakodowanej wartości parametru
W pierwszym przykładzie zacznij od dodania kontrolki DetailsView do DeclarativeParams.aspx
strony w folderze BasicReporting
. Z poziomu tagu inteligentnego kontrolki DetailsView wybierz pozycję <Nowe źródło> danych z listy rozwijanej i wybierz pozycję Dodaj obiekt ObjectDataSource.
Rysunek 1. Dodawanie obiektu ObjectDataSource do strony (kliknij, aby wyświetlić obraz o pełnym rozmiarze)
Spowoduje to automatyczne uruchomienie kreatora Wyboru źródła danych kontrolki ObjectDataSource. Wybierz klasę ProductsBLL
z pierwszego ekranu kreatora.
Rysunek 2. Wybieranie ProductsBLL
klasy (kliknij, aby wyświetlić obraz pełnowymiarowy)
Ponieważ chcemy wyświetlić informacje o konkretnym produkcie, chcemy użyć GetProductByProductID(productID)
metody .
Rysunek 3. Wybieranie GetProductByProductID(productID)
metody (kliknij, aby wyświetlić obraz pełnowymiarowy)
Ponieważ wybrana metoda zawiera parametr, jest jeszcze jeden ekran kreatora, w którym zostanie wyświetlony monit o zdefiniowanie wartości, która ma być używana dla parametru. Lista po lewej stronie zawiera wszystkie parametry wybranej metody. W przypadku GetProductByProductID(productID)
tylko jednego productID
elementu . Po prawej stronie możemy określić wartość wybranego parametru. Lista rozwijana źródła parametrów wylicza różne możliwe źródła dla wartości parametru. Ponieważ chcemy określić ustaloną wartość 5 dla parametru productID
, pozostaw źródło parametru None i wprowadź wartość 5 w polu tekstowym DefaultValue.
Rysunek 4. Zakodowana wartość parametru 5 zostanie użyta dla parametru productID
(kliknij, aby wyświetlić obraz pełnowymiarowy)
Po ukończeniu pracy Kreatora konfigurowania źródła danych znacznik deklaratywne kontrolki ObjectDataSource zawiera Parameter
obiekt w SelectParameters
kolekcji dla każdego parametru wejściowego oczekiwanego przez metodę zdefiniowaną SelectMethod
we właściwości . Ponieważ metoda, której używamy w tym przykładzie, oczekuje tylko jednego parametru wejściowego, parameterID
tutaj istnieje tylko jeden wpis. Kolekcja SelectParameters
może zawierać dowolną klasę pochodzącą Parameter
z klasy w System.Web.UI.WebControls
przestrzeni nazw. W przypadku trwale zakodowanych wartości parametrów używana jest klasa bazowa Parameter
, ale w przypadku innych opcji źródła parametrów używana jest klasa pochodna Parameter
. W razie potrzeby można również utworzyć własne niestandardowe typy parametrów.
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server"
SelectMethod="GetProductByProductID" TypeName="ProductsBLL">
<SelectParameters>
<asp:Parameter DefaultValue="5"
Name="productID" Type="Int32" />
</SelectParameters>
</asp:ObjectDataSource>
Uwaga
Jeśli obserwujesz na własnym komputerze znaczniki deklaratywne, które widzisz w tym momencie, mogą zawierać wartości właściwości InsertMethod
, UpdateMethod
i DeleteMethod
, a także DeleteParameters
. Kreator wyboru źródła danych objectDataSource automatycznie określa metody z ProductBLL
elementu do użycia do wstawiania, aktualizowania i usuwania, więc chyba że jawnie wyczyszczone, zostaną one uwzględnione w znaczniku powyżej.
Podczas odwiedzania tej strony kontrolka sieci Web danych wywoła metodę ObjectDataSource Select
, która wywoła ProductsBLL
metodę klasy GetProductByProductID(productID)
przy użyciu zakodowanej wartości 5 dla parametru wejściowego productID
. Metoda zwróci silnie typizowanego ProductDataTable
obiektu zawierającego jeden wiersz z informacjami o gumbo Mix Chef Antona (produkt z numerem ProductID
5).
Rysunek 5. Wyświetlane są informacje o mixie Gumbo Chef Antona (kliknij, aby wyświetlić obraz pełnowymiarowy)
Ustawianie wartości parametru na wartość właściwości kontrolki sieci Web
Wartości parametrów obiektu ObjectDataSource można również ustawić na podstawie wartości kontrolki sieci Web na stronie. Aby to zilustrować, użyjmy kontrolki GridView zawierającej listę wszystkich dostawców znajdujących się w kraju określonym przez użytkownika. Aby to osiągnąć, dodaj pole tekstowe do strony, do której użytkownik może wprowadzić nazwę kraju. Ustaw właściwość tej kontrolki ID
TextBox na CountryName
wartość . Dodaj również kontrolkę Sieć Web przycisku.
Rysunek 6. Dodawanie kontrolki TextBox do strony za pomocą ID
CountryName
polecenia (kliknij, aby wyświetlić obraz o pełnym rozmiarze)
Następnie dodaj element GridView do strony, a następnie z tagu inteligentnego wybierz opcję dodania nowego obiektu ObjectDataSource. Ponieważ chcemy wyświetlić informacje o dostawcy, wybierz klasę SuppliersBLL
z pierwszego ekranu kreatora. Na drugim ekranie wybierz metodę GetSuppliersByCountry(country)
.
Rysunek 7. Wybieranie GetSuppliersByCountry(country)
metody (kliknij, aby wyświetlić obraz pełnowymiarowy)
GetSuppliersByCountry(country)
Ponieważ metoda ma parametr wejściowy, kreator po raz kolejny zawiera końcowy ekran wybierania wartości parametru. Tym razem ustaw wartość Źródło parametru na Control. Spowoduje to wypełnienie listy rozwijanej ControlID nazwami kontrolek na stronie; wybierz kontrolkę CountryName
z listy. Gdy strona zostanie po raz pierwszy odwiedzona, CountryName
pole TextBox będzie puste, więc żadne wyniki nie zostaną zwrócone i nic nie zostanie wyświetlone. Jeśli chcesz domyślnie wyświetlić niektóre wyniki, ustaw odpowiednio pole tekstowe DefaultValue.
Rysunek 8. Ustaw wartość parametru na wartość kontrolki CountryName
(kliknij, aby wyświetlić obraz o pełnym rozmiarze)
Znacznik deklaratywny obiektu ObjectDataSource różni się nieco od naszego pierwszego przykładu, używając parametru ControlParameter zamiast obiektu standardowego Parameter
. Element ControlParameter
ma dodatkowe właściwości do określenia ID
kontrolki sieci Web i wartości właściwości do użycia dla parametru (PropertyName
). Kreator konfigurowania źródła danych był wystarczająco inteligentny, aby określić, że w przypadku kontrolki TextBox prawdopodobnie będziemy chcieli użyć Text
właściwości dla wartości parametru. Jeśli jednak chcesz użyć innej wartości właściwości z kontrolki Sieci Web, możesz zmienić PropertyName
tę wartość tutaj lub klikając link "Pokaż właściwości zaawansowane" w kreatorze.
<asp:ObjectDataSource ID="ObjectDataSource2" runat="server"
SelectMethod="GetSuppliersByCountry" TypeName="SuppliersBLL">
<SelectParameters>
<asp:ControlParameter ControlID="CountryName"
Name="country" PropertyName="Text"
Type="String" />
</SelectParameters>
</asp:ObjectDataSource>
Podczas odwiedzania strony po raz pierwszy CountryName
pole tekstowe jest puste. Metoda ObjectDataSource Select
jest nadal wywoływana przez obiekt GridView, ale wartość Nothing
jest przekazywana GetSuppliersByCountry(country)
do metody . TableAdapter konwertuje Nothing
wartość na wartość bazy danych NULL
(DBNull.Value
), ale zapytanie używane przez GetSuppliersByCountry(country)
metodę jest zapisywane w taki sposób, że nie zwraca żadnych wartości, gdy NULL
wartość jest określona dla parametru @CategoryID
. Krótko mówiąc, żaden dostawca nie jest zwracany.
Gdy jednak odwiedzający wejdzie do kraju/regionu, a następnie kliknie przycisk Pokaż dostawców, aby spowodować powrót, metoda ObjectDataSource Select
zostanie ponownie zapytana, przekazując wartość kontrolki Text
TextBox jako country
parametr.
Rysunek 9. Pokazano tych dostawców z Kanady (kliknij, aby wyświetlić obraz pełnowymiarowy)
Wyświetlanie wszystkich dostawców domyślnie
Zamiast pokazywać żadnego z dostawców podczas pierwszego wyświetlania strony, możemy najpierw pokazać wszystkich dostawców, umożliwiając użytkownikowi analizowanie listy przez wprowadzenie nazwy kraju w polu tekstowym. Gdy pole TextBox jest puste, SuppliersBLL
metoda klasy jest przekazywana GetSuppliersByCountry(country)
Nothing
dla parametru wejściowego country
. Ta Nothing
wartość jest następnie przekazywana do metody dal GetSupplierByCountry(country)
, gdzie jest tłumaczona na wartość bazy danych NULL
dla parametru @Country
w następującym zapytaniu:
SELECT SupplierID, CompanyName, Address, City, Country, Phone
FROM Suppliers
WHERE Country = @Country
Wyrażenie Country = NULL
zawsze zwraca wartość False, nawet w przypadku rekordów, których Country
kolumna ma NULL
wartość, dlatego nie są zwracane żadne rekordy.
Aby zwrócić wszystkich dostawców, gdy kraj TextBox jest pusty, możemy rozszerzyć GetSuppliersByCountry(country)
metodę w BLL, aby wywołać GetSuppliers()
metodę, gdy jej parametr kraju jest Nothing
i wywołać metodę DAL GetSuppliersByCountry(country)
w przeciwnym razie. Będzie to miało wpływ na zwracanie wszystkich dostawców, gdy nie określono żadnego kraju i odpowiedni podzbiór dostawców, gdy parametr kraju jest uwzględniony.
Zmień metodę GetSuppliersByCountry(country)
w SuppliersBLL
klasie na następującą:
Public Function GetSuppliersByCountry(country As String) _
As Northwind.SuppliersDataTable
If String.IsNullOrEmpty(country) Then
Return GetSuppliers()
Else
Return Adapter.GetSuppliersByCountry(country)
End If
End Function
Dzięki tej zmianie DeclarativeParams.aspx
strona pokazuje wszystkich dostawców po raz pierwszy odwiedzony (lub za każdym razem, gdy CountryName
pole tekstowe jest puste).
Rysunek 10. Wszyscy dostawcy są teraz domyślnie pokazywani (kliknij, aby wyświetlić obraz pełnowymiarowy)
Podsumowanie
Aby używać metod z parametrami wejściowymi, musimy określić wartości parametrów w kolekcji ObjectDataSource SelectParameters
. Różne typy parametrów umożliwiają uzyskanie wartości parametru z różnych źródeł. Domyślny typ parametru używa zakodowanej wartości, ale równie łatwo (i bez wiersza kodu) wartości parametrów można uzyskać z zapytań, zmiennych sesji, plików cookie, a nawet wartości wprowadzonych przez użytkownika z kontrolek sieci Web na stronie.
W przykładach omówionych w tym samouczku pokazano, jak używać wartości parametrów deklaratywnych. Może jednak wystąpić potrzeba użycia źródła parametrów, które jest niedostępne, na przykład bieżącej daty i godziny, lub, jeśli nasza witryna używa członkostwa, identyfikator użytkownika odwiedzających. W takich scenariuszach możemy ustawić wartości parametrów programowo przed wywołaniem metody obiektu źródłowego przez obiekt ObjectDataSource. Zobaczymy, jak to zrobić w następnym samouczku.
Szczęśliwe programowanie!
Informacje o autorze
Scott Mitchell, autor siedmiu książek ASP/ASP.NET i założyciel 4GuysFromRolla.com, współpracuje z technologiami internetowymi firmy Microsoft od 1998 roku. Scott pracuje jako niezależny konsultant, trener i pisarz. Jego najnowsza książka to Sams Teach Yourself ASP.NET 2.0 w 24 godzinach. Można go uzyskać pod adresem mitchell@4GuysFromRolla.com. lub za pośrednictwem swojego bloga, który można znaleźć na stronie http://ScottOnWriting.NET.
Specjalne podziękowania
Ta seria samouczków została omówiona przez wielu przydatnych recenzentów. Główny recenzent tego samouczka to Hilton Giesenow. Chcesz przejrzeć nadchodzące artykuły MSDN? Jeśli tak, upuść mi wiersz pod adresem mitchell@4GuysFromRolla.com.