Dela via


Deklarativa parametrar (VB)

av Scott Mitchell

Ladda ned PDF

I den här självstudien visar vi hur du använder en parameter inställd på ett hårdkodat värde för att välja de data som ska visas i en DetailsView-kontroll.

Inledning

I den senaste självstudien tittade vi på att visa data med kontrollerna GridView, DetailsView och FormView bundna till en ObjectDataSource-kontroll som anropade GetProducts() metoden från ProductsBLL klassen. Metoden GetProducts() returnerar en starkt typad DataTable ifylld med alla poster från Northwind-databasens Products tabell. Klassen ProductsBLL innehåller ytterligare metoder för att returnera bara delmängder av produkterna - GetProductByProductID(productID), GetProductsByCategoryID(categoryID)och GetProductsBySupplierID(supplierID). Dessa tre metoder förväntar sig en indataparameter som anger hur du filtrerar den returnerade produktinformationen.

ObjectDataSource kan användas för att anropa metoder som förväntar sig indataparametrar, men för att kunna göra det måste vi ange var värdena för dessa parametrar kommer ifrån. Parametervärdena kan hårdkodas eller komma från en mängd olika dynamiska källor, till exempel: frågesträngsvärden, sessionsvariabler, egenskapsvärdet för en webbkontroll på sidan eller andra.

I den här självstudien ska vi börja med att illustrera hur du använder en parameter som är inställd på ett hårdkodat värde. Mer specifikt tittar vi på att lägga till en DetailsView på sidan som visar information om en specifik produkt, nämligen Chef Anton's Gumbo Mix, som har en ProductID på 5. Nu ska vi se hur du anger parametervärdet baserat på en webbkontroll. I synnerhet använder vi en textruta för att låta användaren skriva i ett land/en region, varefter de kan klicka på en knapp för att se listan över leverantörer som finns i det landet/regionen.

Använda ett Hard-Coded parametervärde

Börja med att lägga till en DetailsView-kontroll på sidan DeclarativeParams.aspx i BasicReporting mappen i det första exemplet. I Den smarta taggen i DetailsView väljer du <Ny datakälla> i listrutan och väljer att lägga till en ObjectDataSource.

Lägg till en ObjectDataSource på sidan

Bild 1: Lägg till en ObjectDataSource på sidan (Klicka om du vill visa en bild i full storlek)

Detta startar automatiskt ObjectDataSource-kontrollens guiden Välj datakälla. Välj ProductsBLL klassen från den första skärmen i guiden.

Välj ProductsBLL-klass

Bild 2: Välj ProductsBLL klassen (Klicka om du vill visa en bild i full storlek)

Eftersom vi vill visa information om en viss produkt vill vi använda GetProductByProductID(productID) metoden.

Välj metoden GetProductByProductID(productID)

Bild 3: Välj GetProductByProductID(productID) metoden (Klicka om du vill visa en bild i full storlek)

Eftersom metoden vi valde innehåller en parameter finns det ytterligare en skärm för guiden, där vi uppmanas att definiera det värde som ska användas för parametern. Listan till vänster visar alla parametrar för den valda metoden. För GetProductByProductID(productID) så finns det bara en productID. Till höger kan vi ange värdet för den valda parametern. Listrutan parameterkälla räknar upp de olika möjliga källorna för parametervärdet. Eftersom vi vill ange ett hårdkodat värde på 5 för parametern productID lämnar du parameterkällan som Ingen och anger 5 i textrutan DefaultValue.

Ett Hard-Coded parametervärde på 5 används för parametern productID

Bild 4: Ett Hard-Coded parametervärde på 5 används för parametern productID (klicka om du vill visa en bild i full storlek)

När du har slutfört guiden Konfigurera datakälla, innehåller ObjectDataSource-kontrollens deklarativa markering ett Parameter-objekt i SelectParameters-samlingen för var och en av de indataparametrar som förväntas av metoden som definierats i SelectMethod-egenskapen. Eftersom metoden vi använder i det här exemplet bara förväntar sig en enda indataparameter parameterIDfinns det bara en post här. Samlingen SelectParameters kan innehålla alla klasser som härleds från Parameter klassen i System.Web.UI.WebControls namnområdet. För hårdkodade parametervärden används basklassen Parameter , men för de andra alternativen för parameterkällan används en härledd Parameter klass. Du kan också skapa egna anpassade parametertyper om det behövs.

<asp:ObjectDataSource ID="ObjectDataSource1" runat="server"
    SelectMethod="GetProductByProductID" TypeName="ProductsBLL">
    <SelectParameters>
        <asp:Parameter DefaultValue="5"
           Name="productID" Type="Int32" />
    </SelectParameters>
</asp:ObjectDataSource>

Anmärkning

Om du följer med på din egen dator kan den deklarativa markering som du ser nu innehålla värden för InsertMethod, UpdateMethod, och DeleteMethod egenskaperna, samt DeleteParameters. Guiden Välj datakälla i ObjectDataSource anger automatiskt de metoder som ProductBLL ska använda för att infoga, uppdatera och ta bort, så om du inte uttryckligen har rensat dem inkluderas de i markupen ovan.

När du besöker den här sidan anropar datawebbkontrollen Metoden ObjectDataSource Select , som anropar ProductsBLL klassens GetProductByProductID(productID) metod med det hårdkodade värdet 5 för productID indataparametern. Metoden returnerar ett starkt skrivet ProductDataTable objekt som innehåller en enda rad med information om Chef Antons Gumbo Mix (produkten med ProductID 5).

Information om kocken Antons Gumbo Mix visas

Bild 5: Information om kocken Antons Gumbo Mix visas (Klicka om du vill visa en bild i full storlek)

Ange parametervärdet till egenskapsvärdet för en webbkontroll

Parametervärdena för ObjectDataSource kan också anges baserat på värdet för en webbkontroll på sidan. För att illustrera detta ska vi ha en GridView som visar en lista över alla leverantörer som finns i ett land som angetts av användaren. För att göra detta börjar du med att lägga till en textruta på sidan där användaren kan ange ett landsnamn. Ange egenskapen för den här TextBox-kontrollen ID till CountryName. Lägg också till en knappwebbkontroll.

Lägg till en textruta på sidan med ID CountryName

Bild 6: Lägg till en textruta på sidan med IDCountryName (Klicka om du vill visa en bild i full storlek)

Lägg sedan till en GridView på sidan och välj att lägga till en ny ObjectDataSource från den smarta taggen. Eftersom vi vill visa leverantörsinformation väljer du klassen SuppliersBLL från guidens första sida. Från den andra skärmen, välj metoden GetSuppliersByCountry(country).

Välj metoden GetSuppliersByCountry(country)

Bild 7: Välj GetSuppliersByCountry(country) metoden (Klicka om du vill visa en bild i full storlek)

GetSuppliersByCountry(country) Eftersom metoden har en indataparameter innehåller guiden återigen en sista skärm för att välja parametervärdet. Den här gången anger du Parameterkällan till Kontroll. Då fylls listrutan ControlID i med namnen på kontrollerna på sidan. välj kontrollen CountryName i listan. När sidan först besöks CountryName kommer textrutan att vara tom, så inga resultat returneras och ingenting visas. Om du vill visa några resultat som standard anger du textrutan DefaultValue i enlighet med detta.

Ange parametervärdet till countryname-kontrollvärdet

Bild 8: Ange parametervärdet till CountryName kontrollvärdet (klicka om du vill visa en bild i full storlek)

ObjectDataSources deklarativa markering skiljer sig något från vårt första exempel, med hjälp av en ControlParameter i stället för standardobjektet Parameter . En ControlParameter har ytterligare egenskaper för att specificera ID relaterat till webbkontrollen och vilket egenskapsvärde som ska användas för parametern (PropertyName). Guiden Konfigurera datakälla var tillräckligt smart för att fastställa att vi för en textruta sannolikt vill använda Text egenskapen för parametervärdet. Men om du vill använda ett annat egenskapsvärde än webbkontrollen kan du ändra PropertyName värdet här eller genom att klicka på länken Visa avancerade egenskaper i guiden.

<asp:ObjectDataSource ID="ObjectDataSource2" runat="server"
    SelectMethod="GetSuppliersByCountry" TypeName="SuppliersBLL">
    <SelectParameters>
        <asp:ControlParameter ControlID="CountryName"
            Name="country" PropertyName="Text"
            Type="String" />
    </SelectParameters>
</asp:ObjectDataSource>

När du besöker sidan för första gången CountryName är textrutan tom. ObjectDataSource-metodens Select anropas fortfarande av GridView, men ett värde Nothing skickas till GetSuppliersByCountry(country)-metoden. TableAdapter konverterar Nothing till ett databasvärde NULL (DBNull.Value), men frågan som används av GetSuppliersByCountry(country) metoden skrivs så att den inte returnerar några värden när ett NULL värde anges för parametern @CategoryID . Kort därefter returneras inga leverantörer.

När besökaren kommer in i ett område och klickar på knappen Visa leverantörer för att orsaka en postback, skickas ObjectDataSource-metoden Select på nytt, och textbox-kontrollens värde passeras Text som country-parameter.

Dessa leverantörer från Kanada visas

Bild 9: Dessa leverantörer från Kanada visas (Klicka om du vill visa en bild i full storlek)

Visa alla leverantörer som standard

I stället för att visa någon av leverantörerna när vi först visar sidan kanske vi vill visa alla leverantörer först, så att användaren kan parera listan genom att ange ett landsnamn i textrutan. När textrutan är tom SuppliersBLL skickas klassens GetSuppliersByCountry(country) metod in Nothing för indataparametern country . Det här Nothing värdet skickas GetSupplierByCountry(country) sedan ned till DAL-metoden, där det översätts till ett databasvärde NULL för parametern @Country i följande fråga:

SELECT     SupplierID, CompanyName, Address, City, Country, Phone
FROM         Suppliers
WHERE Country = @Country

Uttrycket Country = NULL returnerar alltid False, även för poster vars Country kolumn har ett NULL värde. Därför returneras inga poster.

Om du vill returnera alla leverantörer när landets textruta är tom kan vi utöka GetSuppliersByCountry(country) metoden i BLL för att anropa GetSuppliers() metoden när dess landsparameter är Nothing och anropa DAL-metoden GetSuppliersByCountry(country) på annat sätt. Detta kommer att få effekten att returnera alla leverantörer när inget land anges och lämplig delmängd av leverantörer när landsparametern ingår.

GetSuppliersByCountry(country) Ändra metoden i SuppliersBLL klassen till följande:

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

Med den här ändringen DeclarativeParams.aspx visar sidan alla leverantörer när de först besöktes (eller när textrutan CountryName är tom).

Alla leverantörer visas nu som standard

Bild 10: Alla leverantörer visas nu som standard (klicka om du vill visa en bild i full storlek)

Sammanfattning

För att kunna använda metoder med indataparametrar måste vi ange värdena för parametrarna i ObjectDataSources SelectParameters samling. Med olika typer av parametrar kan parametervärdet hämtas från olika källor. Standardparametertypen använder ett hårdkodat värde, men lika enkelt (och utan en kodrad) parametervärden kan hämtas från frågesträngen, sessionsvariabler, cookies och till och med användarinmatningsvärden från webbkontroller på sidan.

Exemplen som vi tittade på i den här självstudien illustrerade hur du använder deklarativa parametervärden. Det kan dock finnas tillfällen då vi behöver använda en parameterkälla som inte är tillgänglig, till exempel aktuellt datum och tid, eller, om vår webbplats använde Medlemskap, användarens användar-ID. I sådana scenarier kan vi ställa in parametervärdena programmatiskt innan ObjectDataSource anropar dess underliggande objekts metod. Vi får se hur vi gör detta i nästa handledning.

Lycka till med programmerandet!

Om författaren

Scott Mitchell, författare till sju ASP/ASP.NET-böcker och grundare av 4GuysFromRolla.com, har arbetat med Microsofts webbtekniker sedan 1998. Scott arbetar som oberoende konsult, tränare och författare. Hans senaste bok är Sams Teach Yourself ASP.NET 2.0 på 24 timmar. Han kan nås på mitchell@4GuysFromRolla.com.

Särskilt tack till

Den här självstudieserien granskades av många användbara granskare. Huvudgranskare för den här handledningen var Hilton Giesenow. Vill du granska mina kommande MSDN-artiklar? Om så är fallet, hör av dig på mitchell@4GuysFromRolla.com.