Parametry deklaratywne (C#)

przez Scott Mitchell

Pobierz przykładową aplikację lub Pobierz plik PDF

W tym samouczku pokazano, jak za pomocą zestawu parametrów ustawić zakodowaną wartość, aby wybrać dane do wyświetlenia w formancie DetailsView.

Wprowadzenie

W ostatnim samouczku oglądamy wyświetlanie danych za pomocą kontrolek GridView, DetailsView i FormView powiązanych z kontrolką ObjectDataSource, która wywołała metodę GetProducts() z klasy ProductsBLL. Metoda GetProducts() zwraca element DataTable o jednoznacznie określonym typie, wypełniony ze wszystkimi rekordami z tabeli Products bazy danych Northwind. Klasa ProductsBLL zawiera dodatkowe metody zwracające tylko podzestawy 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.

Element ObjectDataSource może służyć do wywoływania metod, które oczekują parametrów wejściowych, ale w tym celu należy określić miejsce, z którego pochodzą wartości tych parametrów. Wartości parametrów mogą być zakodowane na stałe lub mogą pochodzić z różnych źródeł dynamicznych, w tym: wartości QueryString, zmienne sesji, wartość właściwości kontrolki sieci Web na stronie lub inne.

Na potrzeby tego samouczka Zacznijmy od zilustrowania sposobu używania parametru jako wartości zakodowanej. W szczególności Przyjrzyjmy się dodawaniu widoku DetailsView do strony zawierającej informacje dotyczące konkretnego produktu, a mianowicie Chef Anton Gumbo, który ma ProductID 5. Następnie zobaczymy, jak ustawić wartość parametru na podstawie kontrolki sieci Web. W szczególności użyjemy pola tekstowego, aby zezwolić na typ użytkownika w kraju, po którym można kliknąć przycisk, aby wyświetlić listę dostawców znajdujących się w tym kraju.

Używanie zakodowanej wartości parametru

Dla pierwszego przykładu Zacznij od dodania kontrolki DetailsView do strony DeclarativeParams.aspx w folderze BasicReporting. Z poziomu tagu inteligentnego DetailsView wybierz pozycję <nowe źródło danych> z listy rozwijanej i wybierz opcję dodania elementu ObjectDataSource.

dodać elementu ObjectDataSource do strony

Rysunek 1. Dodawanie elementu 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.

wybrać klasy ProductsBLL

Rysunek 2. wybieranie klasy ProductsBLL (kliknij, aby wyświetlić obraz o pełnym rozmiarze)

Ponieważ chcemy wyświetlić informacje o konkretnym produkcie, chcemy użyć metody GetProductByProductID(productID).

wybrać metodę GetProductByProductID (productID)

Rysunek 3. wybierz metodę GetProductByProductID(productID) (kliknij, aby wyświetlić obraz o pełnym rozmiarze)

Ponieważ wybrana metoda zawiera parametr, istnieje jeszcze jeden ekran dla kreatora, w którym zostanie wyświetlony monit o zdefiniowanie wartości do użycia dla parametru. Na liście po lewej stronie są wyświetlane wszystkie parametry wybranej metody. W przypadku GetProductByProductID(productID) istnieje tylko jeden productID. Po prawej stronie możemy określić wartość wybranego parametru. Lista rozwijana Źródło 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 jako brak i wprowadź wartość 5 w polu tekstowym DefaultValue.

ustalona wartość parametru 5 zostanie użyta dla parametru productID

Ilustracja 4. dla parametru productID zostanie użyta twarda wartość parametru 5 (kliknij, aby wyświetlić obraz o pełnym rozmiarze)

Po zakończeniu działania Kreatora konfiguracji źródła danych, znaczniki deklaratywne kontrolki ObjectDataSource zawierają obiekt Parameter w kolekcji SelectParameters dla każdego z parametrów wejściowych oczekiwanych przez metodę zdefiniowaną we właściwości SelectMethod. Ponieważ metoda, której używamy w tym przykładzie, oczekuje tylko jednego parametru wejściowego, parameterID, w tym miejscu znajduje się tylko jeden wpis. Kolekcja SelectParameters może zawierać dowolną klasę, która dziedziczy z klasy Parameter w przestrzeni nazw System.Web.UI.WebControls. W przypadku zakodowanych wartości parametrów jest używana klasa bazowa Parameter, ale dla innych opcji źródła parametrów jest używana Klasa pochodna Parameter; w razie konieczności można także 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>

Note

Jeśli używasz na własnym komputerze, znaczniki deklaratywne widoczne w tym punkcie mogą zawierać wartości InsertMethod, UpdateMethodi DeleteMethod właściwości, a także DeleteParameters. Kreator wyboru źródła danych w elemencie ObjectDataSource automatycznie określa metody z ProductBLL do użycia podczas wstawiania, aktualizowania i usuwania, chyba że jawnie wyczyścisz te, ale zostaną one uwzględnione w powyższym znaczniku.

Podczas odwiedzania tej strony formant sieci Web danych wywoła metodę Select elementu ObjectDataSource, która wywoła metodę GetProductByProductID(productID) klasy ProductsBLL przy użyciu zakodowanej wartości 5 dla productID parametru wejściowego. Metoda zwróci silnie wpisaną obiekt ProductDataTable, który zawiera pojedynczy wiersz z informacjami o połączeniu Gumbo Anton (produkt z ProductID 5).

są wyświetlane informacje dotyczące mieszania Gumbo Anton Chef

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

Ustawianie wartości parametru na wartość właściwości kontrolki sieci Web

Wartości parametrów elementu ObjectDataSource można również ustawić na podstawie wartości kontrolki sieci Web na stronie. Aby to zilustrować, przyjrzyjmy się w widoku GridView, który zawiera listę wszystkich dostawców znajdujących się w kraju określonym przez użytkownika. Aby to zrobić, dodając pole tekstowe do strony, w której użytkownik może wprowadzić nazwę kraju. Ustaw właściwość ID formantu TextBox na CountryName. Dodaj również formant sieci Web przycisku.

dodać pola tekstowego do strony z IDENTYFIKATORem CountryName

Ilustracja 6. Dodawanie pola tekstowego do strony z ID CountryName (kliknij, aby wyświetlić obraz o pełnym rozmiarze)

Następnie Dodaj widok GridView do strony i, z tagu inteligentnego, wybierz opcję dodania nowego elementu ObjectDataSource. Ponieważ chcemy wyświetlić informacje o dostawcach, wybierz klasę SuppliersBLL z pierwszego ekranu kreatora. Na drugim ekranie Wybierz metodę GetSuppliersByCountry(country).

wybrać metody GetSuppliersByCountry (kraj)

Rysunek 7. wybierz metodę GetSuppliersByCountry(country) (kliknij, aby wyświetlić obraz o pełnym rozmiarze)

Ponieważ metoda GetSuppliersByCountry(country) ma parametr wejściowy, Kreator ponownie zawiera końcowy ekran służący do wybierania wartości parametru. Tym razem ustaw Źródło parametru na kontrolkę. Spowoduje to wypełnienie listy rozwijanej ControlID nazwami kontrolek na stronie; Wybierz z listy formant CountryName. Gdy strona zostanie odwiedzana po raz pierwszy, CountryName pole tekstowe będzie puste, więc żadne wyniki nie są zwracane i nic nie zostanie wyświetlone. Jeśli chcesz, aby niektóre wyniki były domyślnie wyświetlane, Ustaw odpowiednio pole tekstowe DefaultValue.

ustawić wartości parametru CountryName

Ilustracja 8. Ustaw wartość parametru na wartość kontrolki CountryName (kliknij, aby wyświetlić obraz w pełnym rozmiarze)

Deklaratywne znaczniki elementu ObjectDataSource różnią się nieco od pierwszego przykładu, przy użyciu parametrze ControlParameter zamiast standardowego obiektu Parameter. ControlParameter ma dodatkowe właściwości do określenia ID kontrolki sieci Web oraz wartości właściwości, która ma być używana dla parametru (PropertyName). Kreator konfiguracji źródła danych był wystarczająco inteligentny, aby określić, że dla pola tekstowego prawdopodobnie zechcemy użyć właściwości Text dla wartości parametru. Jeśli jednak chcesz użyć innej wartości właściwości z formantu sieci Web, możesz zmienić wartość PropertyName w tym miejscu lub klikając łącze "Pokaż zaawansowane właściwości" 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 odwiedzin strony po raz pierwszy pole tekstowe CountryName jest puste. Metoda Select elementu ObjectDataSource jest nadal wywoływana przez element GridView, ale wartość null jest przenoszona do metody GetSuppliersByCountry(country). TableAdapter konwertuje null do bazy danych NULL wartość (DBNull.Value), ale zapytanie używane przez metodę GetSuppliersByCountry(country) jest zapisywana w taki sposób, że nie zwraca żadnych wartości, gdy wartość NULL zostanie określona dla parametru @CategoryID. W skrócie nie są zwracane żadne dostawcy.

Gdy odwiedzający wprowadzi w danym kraju, a następnie kliknie przycisk Pokaż dostawców, aby spowodować odświeżenie, Metoda Select elementu ObjectDataSource zostanie ponownie zbadana, przekazując wartość Text kontrolki TextBox jako parametr country.

dostawców z Kanady są pokazani

Rysunek 9. pokazywane są te dostawcy z Kanady (kliknij, aby wyświetlić obraz o pełnym rozmiarze)

Domyślnie pokazywanie wszystkich dostawców

Zamiast wyświetlać żadnego z dostawców podczas pierwszego wyświetlania strony możemy chcieć wyświetlić wszystkich dostawców na początku, umożliwiając użytkownikowi dostosowanie listy, wprowadzając nazwę kraju w polu tekstowym. Gdy pole tekstowe jest puste, Metoda GetSuppliersByCountry(country) klasy SuppliersBLL jest przenoszona do wartości null dla country parametru wejściowego. Ta null wartość jest następnie przenoszona do metody GetSupplierByCountry(country)owej DAL, w której zostanie przetłumaczona na wartość NULL bazy danych dla parametru @Country w następującej kwerendzie:

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 kolumna Country ma wartość NULL; w związku z tym nie są zwracane żadne rekordy.

Aby zwrócić wszystkich dostawców, gdy pole tekstowe kraj jest puste, można rozszerzyć metodę GetSuppliersByCountry(country) w logiki biznesowej, aby wywołać metodę GetSuppliers(), gdy jej parametr country jest null i wywołać metodę GetSuppliersByCountry(country) dal w inny sposób. 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 Country jest uwzględniony.

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

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

Dzięki tej zmianie na stronie DeclarativeParams.aspx są wyświetlane wszyscy dostawcy podczas pierwszej wizyty (lub za każdym razem, gdy pole tekstowe CountryName jest puste).

wszyscy dostawcy są teraz domyślnie wyświetlani

Rysunek 10: Wszyscy dostawcy są teraz wyświetlani domyślnie (kliknij, aby wyświetlić obraz o pełnym rozmiarze)

Podsumowanie

Aby można było użyć metod z parametrami wejściowymi, musimy określić wartości parametrów w kolekcji SelectParameters elementu ObjectDataSource. 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 (bez wiersza kodu) wartości parametrów mogą być uzyskiwane z ciągu QueryString, zmiennych sesji, plików cookie, a nawet wartości wprowadzonych przez użytkownika z formantów sieci Web na stronie.

Przykłady przedstawione w tym samouczku przedstawiają sposób używania wartości parametrów deklaratywnych. Mogą jednak wystąpić sytuacje, w których musimy używać źródła parametrów, które jest niedostępne, takiego jak bieżąca data i godzina, lub, jeśli nasza witryna korzystała z przynależności do użytkownika. Na potrzeby takich scenariuszy można ustawić wartości parametrów programowo przed wywołaniem metody obiektu bazowego przez element ObjectDataSource. Zobaczymy, jak to zrobić w następnym samouczku.

Szczęśliwe programowanie!

Informacje o autorze

Scott Mitchell, autor siedmiu grup ASP/ASP. NET Books i założyciel of 4GuysFromRolla.com, pracował z technologiami sieci Web firmy Microsoft od czasu 1998. Scott działa jako niezależny konsultant, trainer i składnik zapisywania. Jego Najnowsza książka to Sams ASP.NET 2,0 w ciągu 24 godzin. Można go osiągnąć w mitchell@4GuysFromRolla.com. lub za pośrednictwem swojego blogu, który można znaleźć w http://ScottOnWriting.NET.

Specjalne podziękowania

Ta seria samouczków została sprawdzona przez wielu przydatnych recenzentów. Recenzent potencjalnych klientów dla tego samouczka został Hilton Giesenow. Chcesz przeglądać moje nadchodzące artykuły MSDN? Jeśli tak, upuść mi linię w mitchell@4GuysFromRolla.com.