Udostępnij za pośrednictwem


Parametry deklaratywne (VB)

Autor: Scott Mitchell

Pobierz plik PDF

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.

Dodawanie obiektu ObjectDataSource do strony

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.

Wybierz klasę ProductsBLL

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 .

Wybierz metodę GetProductByProductID(productID)

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 productIDelementu . 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.

Zakodowana wartość parametru 5 będzie używana dla parametru productID

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, parameterIDtutaj 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, UpdateMethodi 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).

Informacje o Gumbo Mix Chef Anton są wyświetlane

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 CountryNamewartość . Dodaj również kontrolkę Sieć Web przycisku.

Dodawanie pola tekstowego do strony z identyfikatorem CountryName

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) .

Wybieranie metody 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.

Ustaw wartość parametru na wartość kontrolki CountryName

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.

Dostawcy z Kanady są wyświetlani

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).

Wszyscy dostawcy są teraz domyślnie pokazywani

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.