Parametry deklaratywne (C#)

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 metodę GetProducts() 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 sposób filtrowania zwróconych informacji 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 w kodzie lub mogą pochodzić z różnych źródeł dynamicznych, takich jak: wartości ciągu zapytania, zmienne sesji, wartość właściwości kontrolki sieci Web na stronie lub inne.

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 Gumbo Mix chef Antona, 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 wartości parametru Hard-Coded

W pierwszym przykładzie zacznij od dodania kontrolki DetailsView do DeclarativeParams.aspx strony w folderze BasicReporting . Z 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 wybierania ź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, na 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) jednego pliku jest tylko jeden productIDobiekt . 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ć zakodowaną wartość 5 dla parametru productID , pozostaw wartość Źródło parametru jako Brak i wprowadź wartość 5 w polu tekstowym DefaultValue.

Wartość parametru Hard-Coded 5 będzie używana dla parametru productID

Rysunek 4. Wartość parametru Hard-Coded 5 będzie używana dla parametru productID (kliknij, aby wyświetlić obraz w pełnym rozmiarze)

Po ukończeniu pracy kreatora Konfigurowanie źródła danych znacznik deklaratywny 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óra jest używana w tym przykładzie, oczekuje tylko jednego parametru wejściowego, parameterIDtutaj znajduje się tylko jeden wpis. Kolekcja SelectParameters może zawierać dowolną klasę pochodzącą Parameter z klasy w System.Web.UI.WebControls przestrzeni nazw. W przypadku zakodowanych na podstawie wartości parametrów używana jest klasa bazowa Parameter , ale w przypadku innych opcji źródła parametrów jest używana 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 jeśli jawnie te nie zostały wyczyszczone, zostaną one uwzględnione w narzucie powyżej.

Podczas odwiedzania tej strony kontrolka internetowa 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, który zawiera jeden wiersz z informacjami o gumbo mix chef Anton (produkt z ProductID 5).

Informacje o mixie Gumbo Chef Antona są wyświetlane

Rysunek 5. Wyświetlane są informacje o mixie Gumbo Chef Antona (kliknij, aby wyświetlić obraz w pełnym rozmiarze)

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, która wyświetla listę wszystkich dostawców znajdujących się w kraju/regionie określonym przez użytkownika. Aby to osiągnąć, dodaj pole TextBox do strony, do której użytkownik może wprowadzić nazwę kraju/kraju. Ustaw właściwość tej kontrolki ID TextBox na CountryNamewartość . Dodaj również kontrolkę Sieć Web przycisku.

Dodawanie kontrolki TextBox do strony z identyfikatorem CountryName

Rysunek 6. Dodawanie kontrolki TextBox do strony za pomocą polecenia IDCountryName (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. Z drugiego ekranu 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 ekran końcowy do wybierania wartości parametru. Tym razem ustaw źródło parametru na Wartość 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. Ustawianie wartości parametru na wartość kontrolki CountryName (kliknij, aby wyświetlić obraz pełnowymiarowy)

Znacznik deklaratywny objectDataSource różni się nieznacznie od naszego pierwszego przykładu, używając parametru ControlParameter zamiast obiektu standardowego Parameter . Obiekt 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 użyjemy 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 wartość w tym miejscu 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 TextBox jest puste. Metoda ObjectDataSource Select jest nadal wywoływana przez obiekt GridView, ale wartość null jest przekazywana do GetSuppliersByCountry(country) metody . TableAdapter konwertuje null 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, nie są zwracani żadni dostawcy.

Gdy jednak odwiedzający wejdzie do kraju i kliknie przycisk Pokaż dostawców, aby spowodować powrót, metoda ObjectDataSource Select zostanie ponownie wyświetlona, przekazując wartość kontrolki Text TextBox jako country parametr.

Ci dostawcy z Kanady są wyświetlani

Rysunek 9. Ci dostawcy z Kanady są wyświetlani (kliknij, aby wyświetlić obraz pełnowymiarowy)

Wyświetlanie domyślnie wszystkich dostawców

Zamiast pokazywać żadnego z dostawców podczas pierwszego wyświetlania strony, na początku możemy chcieć pokazać wszystkich dostawców, umożliwiając użytkownikowi przeanalizowanie listy przez wprowadzenie nazwy kraju/regionu w polu tekstowym. Gdy pole TextBox jest puste, SuppliersBLL metoda klasy jest przekazywana GetSuppliersByCountry(country) w wartości parametru country wejściowegonull. Ta null 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 pole TextBox kraju jest puste, możemy rozszerzyć GetSuppliersByCountry(country) metodę w BLL, aby wywołać GetSuppliers() metodę, gdy jej parametr kraju to null i wywołać metodę DAL GetSuppliersByCountry(country) w przeciwnym razie. Będzie to miało wpływ na zwrócenie wszystkich dostawców, gdy żaden kraj nie zostanie określony, oraz odpowiedni podzbiór dostawców, gdy zostanie uwzględniony parametr kraju.

Zmień metodę GetSuppliersByCountry(country)SuppliersBLL w klasie na następującą:

public Northwind.SuppliersDataTable GetSuppliersByCountry(string country)
{
    if (string.IsNullOrEmpty(country))
        return GetSuppliers();
    else
        return Adapter.GetSuppliersByCountry(country);
}

Dzięki tej zmianie DeclarativeParams.aspx strona pokazuje wszystkich dostawców po raz pierwszy odwiedzony (lub za każdym razem, CountryName gdy pole TextBox jest puste).

Wszyscy dostawcy są teraz domyślnie wyświetlani

Rysunek 10. Wszyscy dostawcy są teraz domyślnie wyświetlani (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. Jednak czasami może być konieczne użycie źródła parametrów, które jest niedostępne, takie jak bieżąca data i godzina, 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 ciągu 24 godzin. Można do niego dotrzeć 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 przejrzyona przez wielu przydatnych recenzentów. Głównym recenzentem tego samouczka był Hilton Giesenow. Chcesz przejrzeć nadchodzące artykuły MSDN? Jeśli tak, upuść mi wiersz pod adresemmitchell@4GuysFromRolla.com .