Begränsa datamodifieringsfunktioner baserat på användaren (VB)

av Scott Mitchell

Ladda ned PDF

I ett webbprogram som gör det möjligt för användare att redigera data kan olika användarkonton ha olika behörigheter för dataredigering. I den här självstudien ska vi undersöka hur du dynamiskt justerar funktionerna för dataändring baserat på den besökande användaren.

Inledning

Ett antal webbprogram stöder användarkonton och tillhandahåller olika alternativ, rapporter och funktioner baserat på den inloggade användaren. Med våra självstudier kanske vi till exempel vill tillåta användare från leverantörsföretagen att logga in på webbplatsen och uppdatera allmän information om sina produkter - deras namn och kvantitet per enhet, kanske - tillsammans med leverantörsinformation, till exempel företagets namn, adress, kontaktpersonens information och så vidare. Dessutom kanske vi vill inkludera vissa användarkonton för personer från vårt företag, så att de kan logga in och uppdatera produktinformation som antal enheter i lager, beställningsnivå och så vidare. Vår webbapp kan också tillåta anonyma användare att besöka (personer som inte har loggat in), men begränsar dem till att bara visa data. Med ett sådant användarkontosystem på plats vill vi att datawebbkontrollerna på våra ASP.NET sidor ska erbjuda de infognings-, redigerings- och borttagningsfunktioner som är lämpliga för den inloggade användaren.

I den här självstudien ska vi undersöka hur du dynamiskt justerar funktionerna för dataändring baserat på den besökande användaren. I synnerhet skapar vi en sida som visar leverantörsinformationen i en redigerbar DetailsView tillsammans med en GridView som visar de produkter som tillhandahålls av leverantören. Om användaren som besöker sidan är från vårt företag kan de: visa eventuell leverantörsinformation; redigera deras adress; och redigera informationen för alla produkter som tillhandahålls av leverantören. Om användaren däremot kommer från ett visst företag kan de bara visa och redigera sin egen adressinformation och kan bara redigera sina produkter som inte har markerats som avbrutna.

En användare från vårt företag kan redigera eventuell leverantörsinformation

Bild 1: En användare från vårt företag kan redigera alla leverantörers information (klicka för att visa en bild i full storlek)

En användare från en viss leverantör kan bara visa och redigera sin information

Bild 2: En användare från en viss leverantör kan bara visa och redigera sin information (Klicka om du vill visa en bild i full storlek)

Låt oss komma igång!

Anmärkning

ASP.NET 2.0 s medlemskapssystem tillhandahåller en standardiserad, utökningsbar plattform för att skapa, hantera och verifiera användarkonton. Eftersom en undersökning av medlemskapssystemet ligger utanför ramen för dessa självstudier, "förfalskar" den här självstudien medlemskap genom att tillåta anonyma besökare att välja om de kommer från en viss leverantör eller från vårt företag. Mer information om medlemskap finns i Artikelserien Undersökning av ASP.NET 2.0:s medlemskap, roller och profil.

Steg 1: Tillåta användaren att ange sina åtkomsträttigheter

I en verklig webbapp skulle en användares kontoinformation inkludera om de arbetade för vårt företag eller för en viss leverantör, och den här informationen skulle vara programmatiskt tillgänglig från våra ASP.NET sidor när användaren har loggat in på webbplatsen. Den här informationen kan samlas in via ASP.NET 2,0 s rollsystem, som kontoinformation på användarnivå via profilsystemet eller på något anpassat sätt.

Eftersom syftet med den här självstudien är att demonstrera justering av datamodifieringsfunktioner baserat på den inloggade användaren och inte är avsedd att visa ASP.NET 2,0-s medlemskap, roller och profilsystem, använder vi en mycket enkel mekanism för att fastställa funktionerna för användaren som besöker sidan – en listruta som användaren kan ange om de ska kunna visa och redigera någon av leverantörsinformationen eller, alternativt vilken specifik leverantörsinformation de kan visa och redigera. Om användaren anger att hon kan visa och redigera all leverantörsinformation (standard) kan hon bläddra igenom alla leverantörer, redigera leverantörens adressinformation och redigera namn och kvantitet per enhet för alla produkter som tillhandahålls av den valda leverantören. Om användaren anger att hon bara kan visa och redigera en viss leverantör kan hon dock bara visa information och produkter för den leverantören och kan bara uppdatera namn och kvantitet per enhetsinformation för de produkter som inte har upphört att användas.

Vårt första steg i den här självstudien är att skapa en rullgardinsmeny och fylla den med leverantörerna i systemet. Öppna sidan UserLevelAccess.aspx i mappen EditInsertDelete, lägg till en Listruta vars ID egenskap är inställd på Suppliers, och binda Listrutan till en ny ObjectDataSource med namnet AllSuppliersDataSource.

Skapa en ny ObjectDataSource med namnet AllSuppliersDataSource

Bild 3: Skapa en ny ObjectDataSource med namnet AllSuppliersDataSource (Klicka om du vill visa en bild i full storlek)

Eftersom vi vill att denna DropDownList ska inkludera alla leverantörer, konfigurerar du ObjectDataSource för att anropa SuppliersBLL-klassens GetSuppliers()-metod. Säkerställ att ObjectDataSource-metoden Update() är mappad till klassen SuppliersBLLs UpdateSupplierAddress-metod, eftersom ObjectDataSource:en också kommer att användas av DetailsView som vi lägger till i steg 2.

När du har slutfört guiden ObjectDataSource, fullfölj stegen genom att konfigurera Suppliers listrutan så att den visar datafältet CompanyName och använder datafältet SupplierID som värde för varje ListItem.

Konfigurera DropDownList Leverantörer för att använda datafälten CompanyName och SupplierID

Bild 4: Konfigurera Suppliers listrutan så att den använder datafälten CompanyName och SupplierID (klicka om du vill visa en bild i full storlek)

I det här läget listrutan visas företagsnamnen för leverantörerna i databasen. Men vi måste också inkludera alternativet "Visa/redigera ALLA leverantörer" i listrutan. För att åstadkomma detta anger du Suppliers egenskapen DropDownList s AppendDataBoundItems till och lägger sedan till true en ListItem vars Text egenskap är "Visa/redigera ALLA leverantörer" och vars värde är -1. Detta kan läggas till direkt via den deklarativa markeringen eller via designern genom att gå till fönstret Egenskaper och klicka på ellipserna i egenskapen DropDownList.Items

Anmärkning

Gå tillbaka till handledningen Master/Detail Filtering With a DropDownList (Huvud-/detaljfiltrering med en listruta) för en mer detaljerad diskussion om hur du lägger till ett "Välj alla"-objekt i en databunden listruta.

När egenskapen AppendDataBoundItems har angetts och lagts ListItem till bör listrutans deklarativa markering se ut så här:

<asp:DropDownList ID="Suppliers" runat="server" AppendDataBoundItems="True"
    DataSourceID="AllSuppliersDataSource" DataTextField="CompanyName"
    DataValueField="SupplierID">
    <asp:ListItem Value="-1">Show/Edit ALL Suppliers</asp:ListItem>
</asp:DropDownList>

Bild 5 visar en skärmbild av vår aktuella utveckling, när det visas i en webbläsare.

Listrutan Leverantörer innehåller en Visa ALLA ListItem plus en för varje leverantör

Bild 5: Listrutan Suppliers innehåller en Visa ALLA ListItem, Plus en för varje leverantör (Klicka om du vill visa en bild i full storlek)

Eftersom vi vill uppdatera användargränssnittet direkt efter att användaren har ändrat sitt val anger du Suppliers egenskapen AutoPostBackDropDownList till true . I steg 2 skapar vi en DetailsView-kontroll som visar information om leverantören/leverantörerna baserat på valet i rullgardinsmenyn. I steg 3 skapar vi sedan en händelsehanterare för den här dropDownList-händelsen SelectedIndexChanged , där vi lägger till kod som binder lämplig leverantörsinformation till DetailsView baserat på den valda leverantören.

Steg 2: Lägga till en DetailsView-kontroll

Vi använder en DetailsView för att visa leverantörsinformation. För den användare som kan visa och redigera alla leverantörer kommer DetailsView att stödja sidindelning, så att användaren kan gå igenom leverantörsinformationen en post i taget. Om användaren arbetar för en viss leverantör visar DetailsView endast den specifika leverantörens information och kommer inte att innehålla ett bläddringsgränssnitt. I båda fallen måste DetailsView tillåta att användaren redigerar leverantörens adress-, stads- och landsfält.

Lägg till en DetailsView på sidan under Suppliers Listrutan, ange dess ID egenskap till SupplierDetailsoch binda den till ObjectDataSource AllSuppliersDataSource som skapades i föregående steg. Markera sedan kryssrutorna Aktivera sidindelning och Aktivera redigering från DetailsView:s smarta tagg.

Anmärkning

Om du inte ser alternativet Aktivera redigering i den smarta taggen DetailsView beror det på att du inte mappade Metoden ObjectDataSource s Update() till SuppliersBLL metoden class s UpdateSupplierAddress . Ta en stund att gå tillbaka och göra den här konfigurationsändringen, varefter alternativet Aktivera redigering ska visas i Den smarta taggen DetailsView.

SuppliersBLL Eftersom klassens UpdateSupplierAddress metod endast accepterar fyra parametrar - supplierID, address, city och country - ändra DetailsViews BoundFields så att CompanyName och Phone BoundFields är skrivskyddade. Ta dessutom bort SupplierID BoundField helt och hållet. Slutligen har AllSuppliersDataSource ObjectDataSource för närvarande OldValuesParameterFormatString-egenskapen inställd på original_{0}. Ta en stund på att ta bort den här egenskapsinställningen från den deklarativa syntaxen helt och hållet, eller ställ in den på standardvärdet {0}.

När du har konfigurerat SupplierDetails DetailsView och AllSuppliersDataSource ObjectDataSource har vi följande deklarativa markering:

<asp:ObjectDataSource ID="AllSuppliersDataSource" runat="server"
    SelectMethod="GetSuppliers" TypeName="SuppliersBLL"
    UpdateMethod="UpdateSupplierAddress">
    <UpdateParameters>
        <asp:Parameter Name="supplierID" Type="Int32" />
        <asp:Parameter Name="address" Type="String" />
        <asp:Parameter Name="city" Type="String" />
        <asp:Parameter Name="country" Type="String" />
    </UpdateParameters>
</asp:ObjectDataSource>
<asp:DetailsView ID="SupplierDetails" runat="server" AllowPaging="True"
    AutoGenerateRows="False" DataKeyNames="SupplierID"
    DataSourceID="AllSuppliersDataSource">
    <Fields>
        <asp:BoundField DataField="CompanyName" HeaderText="Company"
            ReadOnly="True" SortExpression="CompanyName" />
        <asp:BoundField DataField="Address" HeaderText="Address"
            SortExpression="Address" />
        <asp:BoundField DataField="City" HeaderText="City"
            SortExpression="City" />
        <asp:BoundField DataField="Country" HeaderText="Country"
            SortExpression="Country" />
        <asp:BoundField DataField="Phone" HeaderText="Phone" ReadOnly="True"
            SortExpression="Phone" />
        <asp:CommandField ShowEditButton="True" />
    </Fields>
</asp:DetailsView>

Nu kan DetailsView bläddras igenom och den valda leverantörens adressinformation kan uppdateras, oavsett vilket val som gjorts i Suppliers listrutan (se bild 6).

All information om leverantörer kan visas och dess adress uppdateras

Bild 6: All information om leverantörer kan visas och dess adress uppdateras (Klicka om du vill visa en bild i full storlek)

Steg 3: Visa endast den valda leverantörens information

För närvarande visar vår sida information för alla leverantörer, oberoende av om en specifik leverantör har valts i Suppliers listrutan. För att bara visa leverantörsinformationen för den valda leverantören behöver vi lägga till en annan ObjectDataSource på vår sida, en som hämtar information om en viss leverantör.

Lägg till en ny ObjectDataSource på sidan och namnge den SingleSupplierDataSource. Från den smarta taggen klickar du på länken Konfigurera datakälla och låter den använda klassens metod SuppliersBLLGetSupplierBySupplierID(supplierID). Precis som AllSuppliersDataSource med ObjectDataSource har SingleSupplierDataSource metoden ObjectDataSource Update() mappats till SuppliersBLL metoden class s UpdateSupplierAddress .

Konfigurera SingleSupplierDataSource ObjectDataSource att använda metoden GetSupplierBySupplierID(supplierID)

Bild 7: Konfigurera SingleSupplierDataSource ObjectDataSource att använda GetSupplierBySupplierID(supplierID) metoden (Klicka om du vill visa en bild i full storlek)

Därefter uppmanas vi att ange parameterkällan för GetSupplierBySupplierID(supplierID) metodens supplierID indataparameter. Eftersom vi vill visa informationen för den leverantör som har valts från listrutan, använder du DropDownLists Suppliers egenskap som parametrars SelectedValue källa.

Använda listrutan Leverantörer som leverantörs-ID-parameterkälla

Bild 8: Använd Suppliers listrutan som supplierID parameterkälla (klicka om du vill visa en bild i full storlek)

Även om den andra ObjectDataSource har lagts till är DetailsView-kontrollen för närvarande konfigurerad att alltid använda AllSuppliersDataSource ObjectDataSource. Vi måste lägga till logik för att justera datakällan som används av DetailsView beroende på det Suppliers valda listlistobjektet. För att åstadkomma detta skapar du en SelectedIndexChanged händelsehanterare för listrutan Leverantörer. Det här kan du enkelt skapa genom att dubbelklicka på Listrutan i Designern. Den här händelsehanteraren måste fastställa vilken datakälla som ska användas och måste binda om data till DetailsView. Detta görs med följande kod:

Protected Sub Suppliers_SelectedIndexChanged _
    (ByVal sender As Object, ByVal e As System.EventArgs) _
    Handles Suppliers.SelectedIndexChanged
    If Suppliers.SelectedValue = "-1" Then
        ' The "Show/Edit ALL" option has been selected
        SupplierDetails.DataSourceID = "AllSuppliersDataSource"
        ' Reset the page index to show the first record
        SupplierDetails.PageIndex = 0
    Else
        ' The user picked a particular supplier
        SupplierDetails.DataSourceID = "SingleSupplierDataSource"
    End If
    ' Ensure that the DetailsView and GridView are in read-only mode
    SupplierDetails.ChangeMode(DetailsViewMode.ReadOnly)
    ' Need to "refresh" the DetailsView
    SupplierDetails.DataBind()
End Sub

Händelsehanteraren börjar med att avgöra om alternativet Visa/Redigera ALLA leverantörer har valts. I så fall ställer den in SupplierDetails DetailsView's DataSourceID till AllSuppliersDataSource och för användaren tillbaka till den första dataposten i leverantörernas uppsättning genom att ställa in PageIndex-egenskapen till 0. Men om användaren har valt en viss leverantör från listrutan tilldelas DetailsView-objekten DataSourceID till SingleSuppliersDataSource. Oavsett vilken datakälla som används SuppliersDetails återställs läget tillbaka till skrivskyddat läge och data återställs till DetailsView med ett anrop till SuppliersDetails kontrollmetoden DataBind() .

Med den här händelsehanteraren på plats visar DetailsView-kontrollen nu den valda leverantören, såvida inte alternativet "Visa/redigera ALLA leverantörer" har valts, i vilket fall alla leverantörer kan visas via växlingsgränssnittet. Bild 9 visar sidan med alternativet Visa/Redigera ALLA leverantörer valt. Observera att växlingsgränssnittet finns, så att användaren kan besöka och uppdatera alla leverantörer. Bild 10 visar sidan med Ma Maison-leverantören vald. Endast Ma Maisons information kan visas och redigeras i det här fallet.

All information om leverantörer kan visas och redigeras

Bild 9: All information om leverantörer kan visas och redigeras (klicka om du vill visa en bild i full storlek)

Endast den valda leverantörens information kan visas och redigeras

Bild 10: Endast den valda leverantörens information kan visas och redigeras (klicka om du vill visa en bild i full storlek)

Anmärkning

I den här självstudien måste både DropDownList- och DetailsView-kontrollerna EnableViewState vara inställda på true (standard) eftersom egenskaperna för listrutorna SelectedIndex och DetailsView DataSourceID måste behålla sina ändringar vid postbacks.

Steg 4: Lista leverantörernas produkter i en redigerbar GridView

När DetailsView är klart är vårt nästa steg att inkludera en redigerbar GridView som listar de produkter som tillhandahålls av den valda leverantören. Den här GridView-filen bör endast tillåta redigeringar av fälten ProductName och QuantityPerUnit . Om användaren som besöker sidan kommer från en viss leverantör bör den dessutom endast tillåta uppdateringar av de produkter som inte har upphört. För att göra detta måste vi först lägga till en överlagring av ProductsBLL klassens UpdateProducts -metod som bara tar in fälten ProductID, ProductNameoch QuantityPerUnit som indata. Vi har gått igenom den här processen i förväg i många självstudier, så låt oss bara titta på koden här, som bör läggas till i ProductsBLL.

<System.ComponentModel.DataObjectMethodAttribute _
(System.ComponentModel.DataObjectMethodType.Update, False)> _
Public Function UpdateProduct(ByVal productName As String, _
    ByVal quantityPerUnit As String, ByVal productID As Integer) As Boolean
    Dim products As Northwind.ProductsDataTable = Adapter.GetProductByProductID(productID)
    If products.Count = 0 Then
        ' no matching record found, return false
        Return False
    End If
    Dim product As Northwind.ProductsRow = products(0)
    product.ProductName = productName
    If quantityPerUnit Is Nothing Then
        product.SetQuantityPerUnitNull()
    Else
        product.QuantityPerUnit = quantityPerUnit
    End If
    ' Update the product record
    Dim rowsAffected As Integer = Adapter.Update(product)
    ' Return true if precisely one row was updated, otherwise false
    Return rowsAffected = 1
End Function

När överbelastningen har skapats är vi redo att lägga till GridView-kontrollen och dess associerade ObjectDataSource. Lägg till en ny GridView på sidan, ange dess ID egenskap till ProductsBySupplieroch konfigurera den så att den använder en ny ObjectDataSource med namnet ProductsBySupplierDataSource. Eftersom vi vill att GridView ska lista dessa produkter av den valda leverantören använder du ProductsBLL metoden class s GetProductsBySupplierID(supplierID) . Mappa metoden Update() till den nya UpdateProduct överbelastning som vi nyss skapade.

Konfigurera ObjectDataSource för att använda den UpdateProduct-överlagring som just skapats

Bild 11: Konfigurera ObjectDataSource att använda den UpdateProduct överlagring som just skapats (Klicka om du vill visa en bild i full storlek)

Vi uppmanas att välja parameterkällan för GetProductsBySupplierID(supplierID) metodens supplierID indataparameter. Eftersom vi vill visa produkterna för den leverantör som valts i DetailsView använder du SuppliersDetails DetailsView-kontrollens SelectedValue egenskap som parameterkälla.

Använda Egenskapen SuppliersDetails DetailsView s SelectedValue som parameterkälla

Bild 12: Använd SuppliersDetails egenskapen DetailsView som SelectedValue parameterkälla (Klicka om du vill visa en bild i full storlek)

När du återgår till GridView, ta bort alla GridView-fält förutom ProductName, QuantityPerUnit och Discontinued, och markera Discontinued CheckBoxField som skrivskyddad. Kontrollera även alternativet Aktivera redigering från GridViews smarta tagg. När dessa ändringar har gjorts bör deklarativ markering för GridView och ObjectDataSource se ut ungefär så här:

<asp:GridView ID="ProductsBySupplier" runat="server" AutoGenerateColumns="False"
    DataKeyNames="ProductID" DataSourceID="ProductsBySupplierDataSource">
    <Columns>
        <asp:CommandField ShowEditButton="True" />
        <asp:BoundField DataField="ProductName" HeaderText="Product"
            SortExpression="ProductName" />
        <asp:BoundField DataField="QuantityPerUnit" HeaderText="Qty/Unit"
            SortExpression="QuantityPerUnit" />
        <asp:CheckBoxField DataField="Discontinued" HeaderText="Discontinued"
            ReadOnly="True" SortExpression="Discontinued" />
    </Columns>
</asp:GridView>
<asp:ObjectDataSource ID="ProductsBySupplierDataSource" runat="server"
    OldValuesParameterFormatString="original_{0}" TypeName="ProductsBLL"
    SelectMethod="GetProductsBySupplierID" UpdateMethod="UpdateProduct">
    <UpdateParameters>
        <asp:Parameter Name="productName" Type="String" />
        <asp:Parameter Name="quantityPerUnit" Type="String" />
        <asp:Parameter Name="productID" Type="Int32" />
    </UpdateParameters>
    <SelectParameters>
        <asp:ControlParameter ControlID="SupplierDetails" Name="supplierID"
            PropertyName="SelectedValue" Type="Int32" />
    </SelectParameters>
</asp:ObjectDataSource>

Precis som med våra tidigare ObjectDataSources är den här OldValuesParameterFormatString egenskapen inställd på original_{0}, vilket orsakar problem när du försöker uppdatera en produkts namn eller kvantitet per enhet. Ta bort den här egenskapen helt från den deklarativa syntaxen eller ange den till standardvärdet . {0}

När konfigurationen är klar visar vår sida nu de produkter som tillhandahålls av leverantören som valts i GridView (se bild 13). För närvarande kan produktnamn eller kvantitet per enhet uppdateras. Vi måste dock uppdatera vår sidlogik så att sådana funktioner är förbjudna för produkter som upphört för användare som är associerade med en viss leverantör. Vi tar itu med den sista delen i steg 5.

De produkter som tillhandahålls av den valda leverantören visas

Bild 13: De produkter som tillhandahålls av den valda leverantören visas (Klicka om du vill visa en bild i full storlek)

Anmärkning

Med tillägg av detta redigerbara GridView Suppliers bör DropDownList-händelsehanteraren SelectedIndexChanged uppdateras för att returnera GridView till ett skrivskyddat tillstånd. Om en annan leverantör väljs mitt i redigeringen av produktinformation kan motsvarande index i GridView för den nya leverantören också redigeras. För att förhindra detta anger du bara egenskapen EditIndex GridView till -1 i SelectedIndexChanged händelsehanteraren.

Kom också ihåg att det är viktigt att rutnätsvyns visningstillstånd är aktiverat (standardbeteendet). Om du anger egenskapen GridView EnableViewState till falseriskerar du att samtidiga användare oavsiktligt tar bort eller redigerar poster.

Steg 5: Tillåt inte redigering för utgångna produkter när Visa/redigera ALLA leverantörer inte är valt

ProductsBySupplier Även om GridView är fullt fungerande ger det för närvarande för mycket åtkomst till de användare som kommer från en viss leverantör. Enligt våra affärsregler bör sådana användare inte kunna uppdatera utgångna produkter. För att framtvinga detta kan vi dölja (eller inaktivera) knappen Redigera i dessa GridView-rader med utgångna produkter när sidan besöks av en användare från en leverantör.

Skapa en händelsehanterare för GridView-händelsen RowDataBound . I den här händelsehanteraren måste vi avgöra om användaren är associerad med en viss leverantör, vilket för den här självstudien kan fastställas genom att kontrollera egenskapen Suppliers DropDownList – SelectedValue om det är något annat än -1 är användaren associerad med en viss leverantör. För sådana användare måste vi sedan avgöra om produkten har upphört att användas eller inte. Vi kan hämta en referens till den faktiska ProductRow-instansen som är bunden till GridView-raden via e.Row.DataItem-egenskapen, enligt beskrivningen i handledningen Visa sammanfattningsinformation i GridView-footern. Om produkten upphör kan vi hämta en programmatisk referens till knappen Redigera i GridViews Kommandofält med hjälp av de tekniker som beskrivs i föregående självstudie, Lägga till Client-Side bekräftelse vid borttagning. När vi har en referens kan vi sedan dölja eller inaktivera knappen.

Protected Sub ProductsBySupplier_RowDataBound _
    (ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) _
    Handles ProductsBySupplier.RowDataBound
    If e.Row.RowType = DataControlRowType.DataRow Then
        ' Is this a supplier-specific user?
        If Suppliers.SelectedValue <> "-1" Then
            ' Get a reference to the ProductRow
            Dim product As Northwind.ProductsRow = _
                CType(CType(e.Row.DataItem, System.Data.DataRowView).Row, _
                Northwind.ProductsRow)
            ' Is this product discontinued?
            If product.Discontinued Then
                ' Get a reference to the Edit LinkButton
                Dim editButton As LinkButton = _
                    CType(e.Row.Cells(0).Controls(0), LinkButton)
                ' Hide the Edit button
                editButton.Visible = False
            End If
        End If
    End If
End Sub

När denna händelsehanterare är i bruk, kan produkter som har utgått inte redigeras när en användare från en specifik leverantör besöker sidan, eftersom Redigera-knappen är dold för dessa produkter. Till exempel är Chef Anton s Gumbo Mix en utgående produkt för New Orleans Cajun Delights-leverantören. När du besöker sidan för den här leverantören döljs knappen Redigera för den här produkten (se bild 14). Men när du besöker med hjälp av "Visa/redigera ALLA leverantörer" är knappen Redigera tillgänglig (se bild 15).

För Supplier-Specific-användare är redigeringsknappen för kocken Antons Gumbo-mix dold

Bild 14: För Supplier-Specific användare är redigeringsknappen för Kocken Antons Gumbo Mix dold (klicka om du vill visa en bild i full storlek)

För Visa/redigera alla leverantörsanvändare visas redigeringsknappen för Chef Antons Gumbo Mix

Bild 15: För visa/redigera alla leverantörsanvändare, redigeringsknappen för Chef Antons Gumbo Mix visas (Klicka för att visa bild i full storlek)

Söka efter åtkomsträttigheter i affärslogiklagret

I den här handledningen hanterar sidan ASP.NET all logik när det gäller vilken information användaren kan se och vilka produkter han eller hon kan uppdatera. Helst skulle den här logiken också finnas på affärslogiklagret. Till exempel SuppliersBLL kan klassens GetSuppliers() metod (som returnerar alla leverantörer) innehålla en kontroll för att säkerställa att den inloggade användaren inte är associerad med en specifik leverantör. UpdateSupplierAddress På samma sätt kan metoden innehålla en kontroll för att säkerställa att den inloggade användaren antingen arbetade för vårt företag (och därför kan uppdatera alla leverantörers adressinformation) eller är associerad med den leverantör vars data uppdateras.

Jag inkluderade inte sådana BLL-lagerkontroller här eftersom användarens rättigheter i vår tutorial bestäms av en listbox på sidan, som BLL-klasserna inte kan komma åt. När du använder medlemskapssystemet eller något av de färdiga autentiseringsscheman som tillhandahålls av ASP.NET (till exempel Windows-autentisering) kan den för närvarande inloggade användarens information och rollinformation nås från BLL-filen, vilket gör sådana åtkomstbehörighetskontroller möjliga både i presentations- och BLL-lagren.

Sammanfattning

De flesta webbplatser som tillhandahåller användarkonton måste anpassa datamodifieringsgränssnittet baserat på den inloggade användaren. Administrativa användare kanske kan ta bort och redigera alla poster, medan icke-administrativa användare kan begränsas till att endast uppdatera eller ta bort poster som de själva har skapat. Oavsett scenario kan datawebbkontrollerna, ObjectDataSource- och Business Logic Layer-klasserna utökas för att lägga till eller neka vissa funktioner baserat på den inloggade användaren. I den här självstudien såg vi hur du begränsar visningsbara och redigerbara data beroende på om användaren var associerad med en viss leverantör eller om de arbetade för vårt företag.

Den här självstudien avslutar vår undersökning av att infoga, uppdatera och ta bort data med hjälp av kontrollerna GridView, DetailsView och FormView. I nästa självstudie kommer vi att fokusera på att implementera stöd för paginering och sortering.

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.