Delen via


Functionaliteit voor het wijzigen van gegevens beperken op basis van de gebruiker (C#)

door Scott Mitchell

PDF downloaden

In een webtoepassing waarmee gebruikers gegevens kunnen bewerken, hebben verschillende gebruikersaccounts mogelijk verschillende bevoegdheden voor het bewerken van gegevens. In deze zelfstudie bekijken we hoe u de mogelijkheden voor het wijzigen van gegevens dynamisch kunt aanpassen op basis van de bezoekende gebruiker.

Introductie

Een aantal webtoepassingen ondersteunen gebruikersaccounts en bieden verschillende opties, rapporten en functionaliteit op basis van de aangemelde gebruiker. Met onze zelfstudies willen we bijvoorbeeld gebruikers van de leveranciersbedrijven toestaan zich aan te melden bij de site en algemene informatie over hun producten bij te werken - hun naam en hoeveelheid per eenheid, misschien - samen met leveranciersgegevens, zoals hun bedrijfsnaam, adres, de gegevens van de contactpersoon, enzovoort. Bovendien willen we mogelijk enkele gebruikersaccounts opnemen voor personen van ons bedrijf, zodat ze zich kunnen aanmelden en productgegevens kunnen bijwerken, zoals eenheden op voorraad, niveau van opnieuw ordenen, enzovoort. Met onze webtoepassing kunnen anonieme gebruikers mogelijk ook bezoeken (personen die zich niet hebben aangemeld), maar ze beperken tot alleen het weergeven van gegevens. Nu een dergelijk gebruikersaccountsysteem is ingesteld, willen we dat de webbesturingselementen voor gegevens in onze ASP.NET pagina's de mogelijkheden voor invoegen, bewerken en verwijderen bieden die geschikt zijn voor de momenteel aangemelde gebruiker.

In deze zelfstudie bekijken we hoe u de mogelijkheden voor het wijzigen van gegevens dynamisch kunt aanpassen op basis van de bezoekende gebruiker. In het bijzonder maken we een pagina waarin de leveranciersgegevens worden weergegeven in een bewerkbare DetailsView, samen met een GridView waarin de producten van de leverancier worden vermeld. Als de gebruiker die de pagina bezoekt, afkomstig is van ons bedrijf, kan hij of zij alle leveranciersinformatie bekijken; hun adres bewerken; en bewerk de informatie voor elk product van de leverancier. Als de gebruiker echter afkomstig is van een bepaald bedrijf, kunnen ze alleen hun eigen adresgegevens bekijken en bewerken en alleen hun producten bewerken die niet als stopgezet zijn gemarkeerd.

Een gebruiker van ons bedrijf kan alle leveranciersinformatie bewerken

Afbeelding 1: Een gebruiker van ons bedrijf kan gegevens van leveranciers bewerken (klik hier om de volledige afbeelding weer te geven)

Een gebruiker van een bepaalde leverancier kan de gegevens alleen bekijken en bewerken

Afbeelding 2: Een gebruiker van een bepaalde leverancier kan de gegevens alleen weergeven en bewerken (klik hier om de volledige afbeelding weer te geven)

Laten we beginnen!

Opmerking

ASP.NET lidmaatschapssysteem van 2.0 biedt een gestandaardiseerd, uitbreidbaar platform voor het maken, beheren en valideren van gebruikersaccounts. Aangezien een onderzoek naar het lidmaatschapssysteem buiten het bereik van deze zelfstudies valt, creëert deze zelfstudie in plaats daarvan een "nep" lidmaatschap door anonieme bezoekers de keuze te laten maken of ze van een bepaalde leverancier of van ons bedrijf zijn. Raadpleeg voor meer informatie over het lidmaatschap mijn artikelreeks van ASP.NET 2.0's Lidmaatschap, Rollen en Profiel.

Stap 1: de gebruiker toestaan zijn toegangsrechten op te geven

In een echte webtoepassing zou een gebruikersaccountgegevens omvatten of ze voor ons bedrijf of voor een bepaalde leverancier hebben gewerkt. Deze informatie zou programmatisch toegankelijk zijn vanaf onze ASP.NET pagina's zodra de gebruiker zich bij de site heeft aangemeld. Deze informatie kan worden vastgelegd via ASP.NET 2.0-rollensysteem, als accountgegevens op gebruikersniveau via het profielsysteem of via een aantal aangepaste middelen.

Aangezien het doel van deze zelfstudie is om de mogelijkheden voor gegevenswijziging aan te passen op basis van de ingelogde gebruiker en niet bedoeld is om het lidmaatschap, de rol- en profielsystemen van ASP.NET 2.0 te laten zien, gebruiken we een eenvoudig mechanisme om de mogelijkheden voor de gebruiker die de pagina bezoekt vast te stellen: een DropDownList. Hiermee kan de gebruiker aangeven of zij gegevens van leveranciers moeten kunnen bekijken en bewerken, of welke gegevens van bepaalde leveranciers zij kunnen bekijken en bewerken. Als de gebruiker aangeeft dat ze alle leveranciersgegevens (de standaardinstelling) kan bekijken en bewerken, kan ze door alle leveranciers bladeren, alle adresgegevens van leveranciers bewerken en de naam en hoeveelheid per eenheid bewerken voor elk product dat door de geselecteerde leverancier is geleverd. Als de gebruiker aangeeft dat ze alleen een bepaalde leverancier kan bekijken en bewerken, kan ze echter alleen de details en producten voor die ene leverancier bekijken en alleen de naam en hoeveelheid per eenheidsgegevens bijwerken voor die producten die niet worden stopgezet.

Onze eerste stap in deze zelfstudie is het maken van deze DropDownList en het vullen met de leveranciers in het systeem. Open de UserLevelAccess.aspx pagina in de EditInsertDelete map, voeg een vervolgkeuzelijst toe waarvan de eigenschap ID is ingesteld op Suppliers, en bind deze vervolgkeuzelijst aan een nieuwe ObjectDataSource met de naam AllSuppliersDataSource.

Een nieuwe ObjectDataSource maken met de naam AllSuppliersDataSource

Afbeelding 3: Een nieuwe ObjectDataSource maken met de naam AllSuppliersDataSource (Klik hier om de volledige afbeelding weer te geven)

Omdat we willen dat deze DropDownList alle leveranciers bevat, configureert u de ObjectDataSource om de SuppliersBLL klassemethode GetSuppliers() aan te roepen. Zorg er ook voor dat de methode ObjectDataSource Update() is toegewezen aan de SuppliersBLL klassemethode UpdateSupplierAddress , omdat deze ObjectDataSource ook wordt gebruikt door de DetailsView die we in stap 2 gaan toevoegen.

Nadat u de wizard ObjectDataSource hebt voltooid, voert u de stappen uit door de Suppliers DropDownList zodanig te configureren dat het CompanyName gegevensveld wordt weergegeven en het SupplierID gegevensveld wordt gebruikt als de waarde voor elk ListItemveld.

De vervolgkeuzelijst Leveranciers configureren voor het gebruik van de gegevensvelden CompanyName en SupplierID

Afbeelding 4: De vervolgkeuzelijst configureren Suppliers om de CompanyName velden en SupplierID gegevensvelden te gebruiken (klik om de afbeelding op volledige grootte weer te geven)

Op dit moment worden in de vervolgkeuzelijst de bedrijfsnamen van de leveranciers in de database vermeld. We moeten echter ook de optie Alle leveranciers weergeven/bewerken opnemen in de vervolgkeuzelijst. Om dit te bereiken, stelt u de eigenschap van de DropDownList in op Suppliers en voegt u vervolgens een AppendDataBoundItems toe waarvan de eigenschap true is "Alle leveranciers weergeven/bewerken" en waarvan de waarde ListItem is. Dit kan rechtstreeks worden toegevoegd via de declaratieve markering of via de ontwerpfunctie door naar het venster Eigenschappen te gaan en op het beletselteken in de eigenschap DropDownList te Items klikken.

Opmerking

Raadpleeg de zelfstudie Master/Detail Filtering met een vervolgkeuzelijst voor een meer gedetailleerde discussie over het toevoegen van een Alles selecteren-item aan een gegevensgebonden vervolgkeuzelijst.

Nadat de AppendDataBoundItems eigenschap is ingesteld en de ListItem is toegevoegd, zou de declaratieve opmaak van de keuzelijst er als volgt uit moeten zien:

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

Afbeelding 5 toont een schermafbeelding van de huidige voortgang, wanneer deze wordt bekeken via een browser.

De vervolgkeuzelijst Leveranciers bevat een lijstitem "Toon ALLE", plus één voor elke leverancier

Afbeelding 5: De Suppliers vervolgkeuzelijst bevat een alles weergeven ListItem, plus één voor elke leverancier (klik om de volledige afbeelding weer te geven)

Omdat we de gebruikersinterface direct willen bijwerken nadat de gebruiker hun selectie heeft gewijzigd, stelt u de eigenschap Suppliers DropDownList AutoPostBack in op true. In stap 2 maken we een DetailsView-besturingselement dat de informatie voor de leverancier(s) weergeeft op basis van de selectie in de DropDownList. Vervolgens maken we in stap 3 een gebeurtenis-handler voor deze dropdownlist-gebeurtenis SelectedIndexChanged , waarin we code toevoegen waarmee de juiste leveranciersgegevens aan de DetailsView worden gekoppeld op basis van de geselecteerde leverancier.

Stap 2: Een DetailsView-besturingselement toevoegen

Laten we een DetailsView gebruiken om leveranciersgegevens weer te geven. Voor de gebruiker die alle leveranciers kan bekijken en bewerken, biedt de DetailsView ondersteuning voor paginering, zodat de gebruiker de leveranciersinformatie één voor één record kan doorlopen. Als de gebruiker echter voor een bepaalde leverancier werkt, wordt in De DetailsView alleen die gegevens van bepaalde leveranciers weergegeven en wordt er geen pagineringsinterface opgenomen. In beide gevallen moet de gebruiker met DetailsView het adres, de plaats en het land van de leverancier bewerken.

Voeg een DetailsView toe aan de pagina onder de Suppliers DropDownList, stel de eigenschap ID op SupplierDetails, en bind deze aan de AllSuppliersDataSource ObjectDataSource die je in de vorige stap hebt gemaakt. Vink vervolgens de selectievakjes 'Paging inschakelen' en 'Bewerken inschakelen' aan vanuit de smart tag van DetailsView.

Opmerking

Als u geen optie Bewerken inschakelen ziet in de infolabel van DetailsView, komt dit omdat u de methode ObjectDataSource Update() niet hebt toegewezen aan de SuppliersBLL klassemethode UpdateSupplierAddress . Neem even de tijd om terug te gaan en deze configuratiewijziging aan te brengen, waarna de optie Bewerken inschakelen moet worden weergegeven in de infotag van DetailsView.

Aangezien de methode van de SuppliersBLL-klasse slechts vier parameters accepteert - UpdateSupplierAddress, supplierID, address, en city - moet u de BoundFields van de DetailsView wijzigen zodat de BoundFields country en CompanyName alleen-lezen zijn. Verwijder bovendien het SupplierID BoundField helemaal. Ten slotte heeft de AllSuppliersDataSource ObjectDataSource momenteel zijn OldValuesParameterFormatString eigenschap ingesteld op original_{0}. Neem even de tijd om deze eigenschapsinstelling helemaal uit de declaratieve syntaxis te verwijderen of stel deze in op de standaardwaarde. {0}

Na het configureren van de SupplierDetails DetailsView en AllSuppliersDataSource ObjectDataSource hebben we de volgende declaratieve markeringen:

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

Op dit moment kan de DetailsView worden gepaginad en kunnen de adresgegevens van de geselecteerde leverancier worden bijgewerkt, ongeacht de selectie die is gemaakt in de Suppliers vervolgkeuzelijst (zie afbeelding 6).

Alle leveranciersinformatie kan worden bekeken en het adres wordt bijgewerkt

Afbeelding 6: Alle leveranciersgegevens kunnen worden weergegeven en het adres bijgewerkt (klik om de afbeelding op volledige grootte weer te geven)

Stap 3: alleen de gegevens van de geselecteerde leverancier weergeven

Op onze pagina wordt momenteel de informatie voor alle leveranciers weergegeven, ongeacht of een bepaalde leverancier is geselecteerd in de Suppliers vervolgkeuzelijst. Om alleen de leveranciersinformatie voor de geselecteerde leverancier weer te geven, moeten we een andere ObjectDataSource toevoegen aan onze pagina, een die informatie over een bepaalde leverancier ophaalt.

Voeg een nieuwe ObjectDataSource toe aan de pagina en geef deze SingleSupplierDataSourcede naam. Klik vanuit de infotag op de koppeling Gegevensbron configureren en laat deze de methode van SuppliersBLL de GetSupplierBySupplierID(supplierID) klasse gebruiken. Net als bij AllSuppliersDataSource ObjectDataSource moet de SingleSupplierDataSource methode ObjectDataSource Update() zijn toegewezen aan de SuppliersBLL klassemethode UpdateSupplierAddress .

De methode SingleSupplierDataSource ObjectDataSource configureren voor het gebruik van de methode GetSupplierBySupplierID (leverancierID)

Afbeelding 7: De ObjectDataSource configureren SingleSupplierDataSource om de GetSupplierBySupplierID(supplierID) methode te gebruiken (klik om de afbeelding op volledige grootte weer te geven)

Vervolgens wordt u gevraagd om de parameterbron voor de invoerparameter van de GetSupplierBySupplierID(supplierID) methode supplierID op te geven. Omdat we de informatie van de in de vervolgkeuzelijst geselecteerde leverancier willen weergeven, gebruikt u de eigenschap DropDownList als bron voor de parameter.

Gebruik de Leveranciers vervolgkeuzelijst als bron voor de parameter supplierID.

Afbeelding 8: Gebruik de Suppliers vervolgkeuzelijst als parameterbron supplierID (klik hier om de volledige afbeelding weer te geven)

Zelfs wanneer deze tweede ObjectDataSource is toegevoegd, is het Besturingselement DetailsView momenteel geconfigureerd om altijd de AllSuppliersDataSource ObjectDataSource te gebruiken. We moeten logica toevoegen om de gegevensbron die wordt gebruikt door de DetailsView aan te passen, afhankelijk van het Suppliers geselecteerde vervolgkeuzelijstitem. Hiervoor maakt u een SelectedIndexChanged gebeurtenis-handler voor de vervolgkeuzelijst Leveranciers. Dit kan het eenvoudigst worden gemaakt door te dubbelklikken op de vervolgkeuzelijst in de ontwerpfunctie. Deze gebeurtenis-handler moet bepalen welke gegevensbron moet worden gebruikt en de gegevens opnieuw moeten worden gekoppeld aan de DetailsView. Dit wordt bereikt met de volgende code:

protected void Suppliers_SelectedIndexChanged(object sender, EventArgs e)
{
    if (Suppliers.SelectedValue == "-1")
    {
        // 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";
    // Ensure that the DetailsView is in read-only mode
    SupplierDetails.ChangeMode(DetailsViewMode.ReadOnly);
    // Need to "refresh" the DetailsView
    SupplierDetails.DataBind();
}

De gebeurtenis-handler begint met het bepalen of de optie Alle leveranciers weergeven/bewerken is geselecteerd. Als dat het was, stelt de SupplierDetails DetailsView s DataSourceIDAllSuppliersDataSource in en retourneert de gebruiker terug naar het eerste record in de set leveranciers door de PageIndex eigenschap in te stellen op 0. Als de gebruiker echter een bepaalde leverancier heeft geselecteerd in de vervolgkeuzelijst, wordt de DetailsView s DataSourceID toegewezen aan SingleSuppliersDataSource. Ongeacht welke gegevensbron wordt gebruikt, keert de SuppliersDetails modus terug naar de alleen-lezenmodus en worden de gegevens opnieuw gebonden aan de DetailsView door een aanroep naar de methode van het besturingselement SuppliersDetailsDataBind().

Nu deze gebeurtenis-handler is ingesteld, toont het besturingselement DetailsView nu de geselecteerde leverancier, tenzij de optie Alle leveranciers weergeven/bewerken is geselecteerd, in welk geval alle leveranciers kunnen worden bekeken via de paging-interface. Afbeelding 9 toont de pagina met de optie Alle leveranciers weergeven/bewerken geselecteerd; Houd er rekening mee dat de pagineringsinterface aanwezig is, zodat de gebruiker een leverancier kan bezoeken en bijwerken. In afbeelding 10 ziet u de pagina waarop de Ma Maison-leverancier is geselecteerd. Alleen Ma Maison's informatie is zichtbaar en bewerkbaar in dit geval.

Alle leveranciersinformatie kan worden bekeken en bewerkt

Afbeelding 9: Alle leveranciersinformatie kan worden bekeken en bewerkt (klik om de afbeelding op volledige grootte weer te geven)

Alleen de gegevens van de geselecteerde leverancier kunnen worden bekeken en bewerkt

Afbeelding 10: Alleen de gegevens van de geselecteerde leverancier kunnen worden bekeken en bewerkt (klik om de afbeelding op volledige grootte weer te geven)

Opmerking

Voor deze zelfstudie moeten zowel het besturingselement DropDownList als het besturingselement DetailsView EnableViewState zijn ingesteld op true (de standaardinstelling), omdat de wijzigingen van de eigenschap van DropDownList SelectedIndex en de eigenschap van DetailsView DataSourceID moeten worden onthouden in postbacks.

Stap 4: de leveranciersproducten weergeven in een bewerkbare GridView

Nu de DetailsView is voltooid, is de volgende stap het opnemen van een bewerkbare GridView waarin deze producten worden vermeld die door de geselecteerde leverancier worden geleverd. Deze GridView moet alleen bewerkingen in de velden ProductName en QuantityPerUnit toestaan. Bovendien, als de gebruiker die de pagina bezoekt afkomstig is van een bepaalde leverancier, mag deze alleen updates toestaan voor die producten die niet worden stopgezet. Om dit te bereiken, moeten we eerst een overbelasting toevoegen van de ProductsBLL klassemethode UpdateProducts die alleen de ProductID, ProductNameen QuantityPerUnit velden als invoer inneemt. We hebben dit proces vooraf doorlopen in talloze zelfstudies, dus laten we de code hier bekijken, die moet worden toegevoegd aan ProductsBLL:

[System.ComponentModel.DataObjectMethodAttribute(
System.ComponentModel.DataObjectMethodType.Update, false)]
public bool UpdateProduct(string productName, string quantityPerUnit, int productID)
{
    Northwind.ProductsDataTable products = Adapter.GetProductByProductID(productID);
    if (products.Count == 0)
        // no matching record found, return false
        return false;
    Northwind.ProductsRow product = products[0];
    product.ProductName = productName;
    if (quantityPerUnit == null)
        product.SetQuantityPerUnitNull();
    else
        product.QuantityPerUnit = quantityPerUnit;
    // Update the product record
    int rowsAffected = Adapter.Update(product);
    // Return true if precisely one row was updated, otherwise false
    return rowsAffected == 1;
}

Nu deze overbelasting is gemaakt, zijn we klaar om het GridView-besturingselement en de bijbehorende ObjectDataSource toe te voegen. Voeg een nieuwe GridView toe aan de pagina, stel de eigenschap in IDProductsBySupplierop en configureer deze voor het gebruik van een nieuwe ObjectDataSource met de naam ProductsBySupplierDataSource. Omdat we willen dat deze GridView de producten weergeeft volgens de geselecteerde leverancier, gebruikt u de ProductsBLL klasse s GetProductsBySupplierID(supplierID) methode. Wijs ook de Update() methode toe aan de nieuwe UpdateProduct overbelasting die we zojuist hebben gemaakt.

Configureer de ObjectDataSource om de zojuist aangemaakte overload van UpdateProduct te gebruiken

Afbeelding 11: De ObjectDataSource configureren om de UpdateProduct zojuist gemaakte overbelasting te gebruiken (klik om de afbeelding op volledige grootte weer te geven)

We worden gevraagd om de parameterbron voor de invoerparameter van de GetProductsBySupplierID(supplierID) methode supplierID te selecteren. Omdat we de producten willen weergeven voor de leverancier die is geselecteerd in de DetailsView, gebruikt u de SuppliersDetails eigenschap DetailsView-besturingselement SelectedValue als de parameterbron.

De eigenschap SuppliersDetails DetailsView s SelectedValue gebruiken als parameterbron

Afbeelding 12: Gebruik de SuppliersDetails eigenschap DetailsView als SelectedValue parameterbron (klik om de afbeelding op volledige grootte weer te geven)

Als u terugkeert naar de GridView, verwijdert u alle GridView-velden, met uitzondering van ProductName, QuantityPerUniten Discontinuedmarkeert u het Discontinued SelectievakjeVeld als alleen-lezen. Schakel ook de optie Bewerken inschakelen in vanuit de slimme tag van GridView. Nadat deze wijzigingen zijn aangebracht, moeten de declaratieve markeringen voor de GridView en ObjectDataSource er ongeveer als volgt uitzien:

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

Net als bij onze vorige ObjectDataSources is deze OldValuesParameterFormatString eigenschap ingesteld op original_{0}, wat problemen veroorzaakt bij het bijwerken van een productnaam of hoeveelheid per eenheid. Verwijder deze eigenschap helemaal uit de declaratieve syntaxis of stel deze in op de standaardinstelling. {0}

Nu deze configuratie is voltooid, bevat onze pagina nu de producten die door de leverancier zijn geleverd die zijn geselecteerd in de GridView (zie afbeelding 13). Op dit moment kan elke productnaam of hoeveelheid per eenheid worden bijgewerkt. We moeten onze paginalogica echter bijwerken, zodat dergelijke functionaliteit niet is toegestaan voor stopgezette producten voor gebruikers die zijn gekoppeld aan een bepaalde leverancier. We gaan dit laatste stuk in stap 5 aanpakken.

De producten van de geselecteerde leverancier worden weergegeven

Afbeelding 13: De producten die door de geselecteerde leverancier worden geleverd, worden weergegeven (klik hier om de afbeelding op volledige grootte weer te geven)

Opmerking

Met de toevoeging van deze bewerkbare GridView moet de gebeurtenis-handler van DropDownList worden bijgewerkt, zodat de GridView weer in alleen-lezen modus komt. Als een andere leverancier wordt geselecteerd tijdens het bewerken van productgegevens, kan de bijbehorende index in gridview voor de nieuwe leverancier ook worden bewerkt. U kunt dit voorkomen door de eigenschap EditIndex van de GridView in de gebeurtenis-handler -1 in te stellen op SelectedIndexChanged.

Denk er ook aan dat het belangrijk is dat de weergavestatus van GridView is ingeschakeld (het standaardgedrag). Als u de EnableViewState-eigenschap van GridView instelt op false, loopt u het risico dat gelijktijdige gebruikers onbedoeld records verwijderen of bewerken.

Stap 5: Bewerken voor stopgezette producten niet toestaan wanneer ALLE leveranciers weergeven/bewerken niet is geselecteerd

Hoewel GridView volledig functioneel is, verleent het ProductsBySupplier momenteel te veel toegang tot gebruikers die afkomstig zijn van een bepaalde leverancier. Volgens onze bedrijfsregels mogen dergelijke gebruikers niet in staat zijn om stopgezette producten bij te werken. Om dit af te dwingen, kunnen we de knop Bewerken verbergen (of uitschakelen) in die GridView-rijen met stopgezette producten wanneer de pagina wordt bezocht door een gebruiker van een leverancier.

Maak een gebeurtenis-handler voor de GridView-gebeurtenis RowDataBound . In deze event handler moeten we bepalen of de gebruiker is gekoppeld aan een specifieke leverancier, wat voor deze zelfstudie kan worden vastgesteld door de eigenschap van de vervolgkeuzelijst Leveranciers SelectedValue te controleren. Als deze waarde anders is dan -1, is de gebruiker gekoppeld aan een specifieke leverancier. Voor dergelijke gebruikers moeten we vervolgens bepalen of het product al dan niet wordt stopgezet. We kunnen een verwijzing ophalen naar het werkelijke ProductRow exemplaar dat is gebonden aan de GridView-rij via de e.Row.DataItem eigenschap, zoals besproken in de zelfstudie Samenvattingsinformatie weergeven in de voettekst van de GridView. Als het product wordt stopgezet, kunnen we een programmatische verwijzing naar de knop Bewerken in het GridView-opdrachtveld ophalen met behulp van de technieken die in de vorige zelfstudie zijn besproken, toevoegen Client-Side bevestiging bij het verwijderen. Zodra we een verwijzing hebben, kunnen we de knop verbergen of uitschakelen.

protected void ProductsBySupplier_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        // Is this a supplier-specific user?
        if (Suppliers.SelectedValue != "-1")
        {
            // Get a reference to the ProductRow
            Northwind.ProductsRow product =
                (Northwind.ProductsRow)((System.Data.DataRowView)e.Row.DataItem).Row;
            // Is this product discontinued?
            if (product.Discontinued)
            {
                // Get a reference to the Edit LinkButton
                LinkButton editButton = (LinkButton)e.Row.Cells[0].Controls[0];
                // Hide the Edit button
                editButton.Visible = false;
            }
        }
    }
}

Als de event handler is ingesteld, kunt u niet bewerken wanneer u deze pagina bezoekt als gebruiker van een specifieke leverancier, omdat de knop Bewerken voor deze producten verborgen is voor uit de handel genomen producten. Chef Anton s Gumbo Mix is bijvoorbeeld een stopgezet product voor de New Orleans Cajun Delights leverancier. Wanneer u de pagina voor deze specifieke leverancier bezoekt, is de knop Bewerken voor dit product verborgen (zie afbeelding 14). Wanneer u echter de optie Alle leveranciers weergeven/bewerken gebruikt, is de knop Bewerken beschikbaar (zie afbeelding 15).

Voor Supplier-Specific Gebruikers is de knop Bewerken voor Chef Anton s Gumbo Mix verborgen

Afbeelding 14: Voor Supplier-Specific Gebruikers is de knop Bewerken voor Chef Anton s Gumbo Mix verborgen (klik hier om de volledige afbeelding weer te geven)

Voor Alle gebruikers van leveranciers weergeven/bewerken, wordt de knop Bewerken voor Chef Anton s Gumbo Mix weergegeven

Afbeelding 15: Voor Alle leveranciers weergeven/bewerken, wordt de knop Bewerken voor Chef Anton s Gumbo Mix weergegeven (klik om de volledige afbeelding weer te geven)

Controleren op toegangsrechten in de bedrijfslogicalaag

In deze zelfstudie verwerkt de ASP.NET pagina alle logica met betrekking tot welke informatie de gebruiker kan zien en welke producten hij kan bijwerken. In het ideale stadium zou deze logica ook aanwezig zijn op de bedrijfslogicalaag. De SuppliersBLL klasse GetSuppliers() methode (die alle leveranciers retourneert) kan bijvoorbeeld een controle bevatten om ervoor te zorgen dat de aangemelde gebruiker niet is gekoppeld aan een specifieke leverancier. Op dezelfde manier kan de UpdateSupplierAddress methode een controle bevatten om ervoor te zorgen dat de momenteel aangemelde gebruiker heeft gewerkt voor ons bedrijf (en daarom alle adresgegevens van leveranciers kan bijwerken) of is gekoppeld aan de leverancier waarvan de gegevens worden bijgewerkt.

Ik heb dergelijke BLL-layer-controles hier niet opgenomen omdat in onze zelfstudie de gebruikersrechten worden bepaald door een DropDownList op de pagina, waartoe de BLL-klassen geen toegang hebben. Wanneer u het lidmaatschapssysteem of een van de kant-en-klare verificatieschema's gebruikt die worden geleverd door ASP.NET (zoals Windows-verificatie), kunnen de momenteel aangemelde gebruikersgegevens en rollengegevens worden geopend vanuit het BLL, waardoor dergelijke toegangsrechten kunnen worden gecontroleerd op zowel de presentatie- als de BLL-lagen.

Samenvatting

De meeste sites die gebruikersaccounts bieden, moeten de interface voor het wijzigen van gegevens aanpassen op basis van de aangemelde gebruiker. Gebruikers met beheerdersrechten kunnen mogelijk records verwijderen en bewerken, terwijl gebruikers die geen beheerdersrechten hebben, mogelijk worden beperkt tot het bijwerken of verwijderen van records die ze zelf hebben gemaakt. Wat het scenario ook is, de gegevenswebbesturingselementen, ObjectDataSource- en Business Logic Layer-klassen kunnen worden uitgebreid om bepaalde functionaliteit toe te voegen of te weigeren op basis van de aangemelde gebruiker. In deze zelfstudie hebben we gezien hoe we de weergave- en bewerkbare gegevens kunnen beperken, afhankelijk van of de gebruiker is gekoppeld aan een bepaalde leverancier of of ze voor ons bedrijf hebben gewerkt.

In deze zelfstudie wordt het onderzoek afgerond van het invoegen, bijwerken en verwijderen van gegevens met behulp van de besturingselementen GridView, DetailsView en FormView. Vanaf de volgende cursus richten we onze aandacht op het toevoegen van ondersteuning voor paging en sortering.

Veel plezier met programmeren!

Over de auteur

Scott Mitchell, auteur van zeven ASP/ASP.NET-boeken en oprichter van 4GuysFromRolla.com, werkt sinds 1998 met Microsoft-webtechnologieën. Scott werkt als onafhankelijk consultant, trainer en schrijver. Zijn laatste boek is Sams Teach Yourself ASP.NET 2.0 in 24 uur. Hij kan worden bereikt op mitchell@4GuysFromRolla.com.