Megosztás a következőn keresztül:


Az adatmódosítási funkciók korlátozása a felhasználó alapján (C#)

által Scott Mitchell

PDF letöltése

Egy olyan webalkalmazásban, amely lehetővé teszi a felhasználók számára az adatok szerkesztését, a különböző felhasználói fiókok különböző adatszerkesztési jogosultságokkal rendelkezhetnek. Ebben az oktatóanyagban azt vizsgáljuk meg, hogyan módosíthatja dinamikusan az adatmódosítási képességeket a látogató felhasználó alapján.

Bevezetés

Számos webalkalmazás támogatja a felhasználói fiókokat, és különböző lehetőségeket, jelentéseket és funkciókat biztosít a bejelentkezett felhasználó alapján. Az oktatóanyagainkkal például lehetővé szeretnénk tenni, hogy a beszállító vállalatok felhasználói bejelentkezhessenek a webhelyre, és frissíthessék a termékükkel kapcsolatos általános információkat - például a nevüket és mennyiségüket egységenként, esetleg - a szállítók adataival együtt, például a vállalat nevét, címét, a kapcsolattartó adatait stb. Emellett érdemes lehet néhány felhasználói fiókot is felvenni a vállalatunkból származó személyek számára, hogy bejelentkezhessenek, és frissíthessék a termékinformációkat, például a készleten lévő egységeket, az átrendezés szintjét stb. Webalkalmazásunk lehetővé teheti a névtelen felhasználók látogatását is (akik nem jelentkeztek be), de csak az adatok megtekintésére korlátoznák őket. Egy ilyen felhasználói fiókrendszerrel azt szeretnénk, hogy a ASP.NET lapjaink adat-webvezérlői a jelenleg bejelentkezett felhasználónak megfelelő beszúrási, szerkesztési és törlési képességeket kínálják.

Ebben az oktatóanyagban azt vizsgáljuk meg, hogyan módosíthatja dinamikusan az adatmódosítási képességeket a látogató felhasználó alapján. Létrehozunk egy oldalt, amely egy szerkeszthető DetailsView-ban jeleníti meg a szállítók adatait, valamint egy GridView-t, amely felsorolja a szállító által biztosított termékeket. Ha az oldalt látogató felhasználó a cégünktől származik, megtekintheti a szállítók adatait; a cím szerkesztése; és szerkessze a szállító által biztosított termék adatait. Ha azonban a felhasználó egy adott vállalattól származik, csak a saját címadatait tekintheti meg és szerkesztheti, és csak azokat a termékeket szerkesztheti, amelyeket nem jelölt meg megszűntként.

A vállalatunkból származó felhasználók szerkeszthetik a szállítók adatait

1. ábra: A vállalatunk felhasználói szerkeszthetik a szállítók adatait (kattintson ide a teljes méretű kép megtekintéséhez)

Egy adott szállító felhasználója csak megtekintheti és szerkesztheti az adatait

2. ábra: Egy adott szállító felhasználója csak megtekintheti és szerkesztheti az adatait (ide kattintva megtekintheti a teljes méretű képet)

Lássunk hozzá!

Megjegyzés:

ASP.NET 2.0-s tagsági rendszer szabványosított, bővíthető platformot biztosít a felhasználói fiókok létrehozásához, kezeléséhez és érvényesítéséhez. Mivel a tagsági rendszer vizsgálata meghaladja az oktatóanyagok hatókörét, ez az oktatóanyag ehelyett "hamis" tagságot biztosít, lehetővé téve a névtelen látogatók számára, hogy eldöntsék, hogy egy adott szállítótól vagy a cégünktől származnak-e. A tagságról további információt a ASP.NET 2.0-s tagság, szerepkörök és profil cikksorozatban talál.

1. lépés: A felhasználó hozzáférési jogosultságainak megadása

Egy valós webalkalmazásban a felhasználói fiók adatai közé tartozik, hogy a vállalatnál vagy egy adott szállítónál dolgoztak-e, és ezek az információk programozott módon elérhetők lesznek a ASP.NET lapjainkról, miután a felhasználó bejelentkezett az oldalra. Ezeket az információkat ASP.NET 2.0-s szerepkörök rendszerén keresztül, felhasználói szintű fiókinformációként rögzítheti a profilrendszeren keresztül vagy valamilyen egyéni módon.

Mivel az oktatóanyag célja, hogy bemutassuk az adatmódosítási képességeknek a bejelentkezett felhasználó alapján történő módosítását, és nem ASP.NET 2.0-s tagság, szerepkörök és profilrendszerek bemutatását, egy nagyon egyszerű mechanizmust használunk az oldalt látogató felhasználó képességeinek meghatározására – egy legördülő listára, amelyből a felhasználó jelezheti, hogy meg tudja-e tekinteni és szerkeszteni a beszállítók adatait, vagy másik lehetőségként, hogy milyen szállítói információkat tekinthetnek meg és szerkeszthetnek. Ha a felhasználó azt jelzi, hogy megtekintheti és szerkesztheti az összes szállítói információt (az alapértelmezett), átlapozhatja az összes szállítót, szerkesztheti a szállítók címadatait, és szerkesztheti a kiválasztott szállító által megadott termékek nevét és mennyiségét egységenként. Ha a felhasználó azt jelzi, hogy csak egy adott szállítót tekinthet meg és szerkeszthet, akkor csak az adott szállító adatait és termékeit tekintheti meg, és csak a nem megszűnt termékek nevét és mennyiségét frissítheti egységenként.

A tutorial első lépése, hogy létrehozzunk egy legördülő listát, és ellássuk a rendszerben található beszállítókkal. Nyissa meg a UserLevelAccess.aspx lapot a EditInsertDelete mappában, adjon hozzá egy DropDownList-et, amelynek ID a tulajdonsága be van állítva Suppliers, és kösse ezt a DropDownList-et egy új ObjectDataSource nevű AllSuppliersDataSourceobjektumhoz.

Új ObjectDataSource létrehozása AllSuppliersDataSource néven

3. ábra: Új, elnevezett AllSuppliersDataSource ObjectDataSource létrehozása (kattintson ide a teljes méretű kép megtekintéséhez)

Mivel azt szeretnénk, hogy ez a DropDownList tartalmazza az összes szállítót, konfigurálja az ObjectDataSource-t az osztály metódusának SuppliersBLLGetSuppliers() meghívására. Győződjön meg arról is, hogy az ObjectDataSource Update() metódus megfeleltetve van az SuppliersBLL osztály metódusának UpdateSupplierAddress , mivel ezt az ObjectDataSource-t a 2. lépésben hozzáadandó DetailsView is használni fogja.

Az ObjectDataSource varázsló befejezése után hajtsa végre a lépéseket a Suppliers Legördülő lista konfigurálásával, hogy az megjeleníti az CompanyName adatmezőt, és az SupplierID adatmezőt használja az egyes ListItemértékekhez.

A Szállítók legördülő lista konfigurálása a CompanyName és a SupplierID adatmezők használatára

4. ábra: A legördülő lista konfigurálása Suppliers az és CompanyName az SupplierID adatmezők használatára (ide kattintva megtekintheti a teljes méretű képet)

Ezen a ponton a DropDownList felsorolja az adatbázis szállítóinak cégneveit. A legördülő listához azonban hozzá kell adni a "Show/Edit ALL Suppliers" (Az ÖSSZES szállító megjelenítése/szerkesztése) lehetőséget is. Ahhoz, hogy ezt elérje, állítsa be a Suppliers DropDownList AppendDataBoundItems tulajdonságát true-ra, majd adjon hozzá egy ListItem elemet, amelynek Text tulajdonsága "Minden szállító megjelenítése/szerkesztése", és amelynek értéke -1. Ezt közvetlenül hozzá lehet adni a deklaratív jelöléssel vagy a Tervező nézet segítségével a Tulajdonságok ablak megnyitásával, majd a DropDownList Items tulajdonság ellipszisére kattintva.

Megjegyzés:

Tekintsen vissza a Fő/Részletes szűrés DropDownList-tel című oktatóanyagra, amely részletesebben ismerteti, hogyan lehet hozzáadni egy 'Összes kijelölése' elemet egy adathoz kötött DropDownList-hez.

A AppendDataBoundItems tulajdonság beállítása és hozzáadása ListItem után a DropDownList deklaratív korrektúrának a következőképpen kell kinéznie:

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

Az 5. ábra egy képernyőfelvételt jelenít meg az aktuális állapotról, amikor egy böngészőben tekinti meg.

A Szállítói legördülő lista tartalmaz egy 'Show ALL' ListItemet, valamint egyet-egyet az egyes szállítókhoz

5. ábra: A Suppliers legördülő lista tartalmazza az ÖSSZES ListItem megjelenítése opciót, valamint egyet-egyet minden egyes szállítóhoz (kattintson ide a teljes méretű kép megtekintéséhez)

Mivel közvetlenül azután szeretnénk frissíteni a felhasználói felületet, hogy a felhasználó módosította a kijelölést, állítsa a Suppliers DropDownList tulajdonságot AutoPostBack a következőre true: . A 2. lépésben létrehozunk egy DetailsView-vezérlőt, amely megjeleníti a szállító(k) adatait a Legördülő lista kiválasztása alapján. Ezután a 3. lépésben létrehozunk egy eseménykezelőt ehhez a DropDownList-eseményhez SelectedIndexChanged , amelyben olyan kódot adunk hozzá, amely a megfelelő szállítói adatokat a DetailsView-hoz köti a kiválasztott szállító alapján.

2. lépés: DetailsView-vezérlő hozzáadása

Használjunk DetailsView-t a szállítói adatok megjelenítéséhez. Az összes szállító megtekintésére és szerkesztésére képes felhasználó számára a DetailsView támogatja a lapozást, lehetővé téve a felhasználó számára, hogy egyszerre egy rekorddal lépkedjen át a szállítói információkon. Ha azonban a felhasználó egy adott szállítónál dolgozik, a DetailsView csak az adott szállító adatait jeleníti meg, és nem tartalmaz lapozófelületet. Mindkét esetben a DetailsView-nak lehetővé kell tennie, hogy a felhasználó szerkessze a szállító címét, városát és országmezőit.

Adjon hozzá egy DetailsView-t a Suppliers DropDownList alatti laphoz, állítsa be a tulajdonságát IDSupplierDetails, és kösse hozzá az AllSuppliersDataSource előző lépésben létrehozott ObjectDataSource-hoz. Ezután jelölje be a Lapozás engedélyezése és a Szerkesztés engedélyezése jelölőnégyzetet a DetailsView intelligens címkéje alapján.

Megjegyzés:

Ha nem látja a Szerkesztés engedélyezése lehetőséget a DetailsView intelligens címkéjében, az azért van, mert nem képezte le az ObjectDataSource Update() metódusát az SuppliersBLL osztály UpdateSupplierAddress metódusára. Szánjon egy kis időt, hogy visszatérjen, és módosítsa ezt a konfigurációt, amely után a Szerkesztés engedélyezése lehetőségnek meg kell jelennie a DetailsView intelligens címkéjében.

Mivel az SuppliersBLL osztály UpdateSupplierAddress metódusa csak négy paramétert fogad el – supplierID, address, city és country –, módosítsa a DetailsView BoundField-eket úgy, hogy a CompanyName és Phone BoundField-ek írásvédettek legyenek. Emellett távolítsa el a SupplierID BoundFieldet is. Végül, az AllSuppliersDataSource ObjectDataSource OldValuesParameterFormatString tulajdonsága jelenleg original_{0} értékre van állítva. Szánjon egy kis időt a tulajdonságbeállítás teljes eltávolítására a deklaratív szintaxisból, vagy állítsa be az alapértelmezett értékre. {0}

A SupplierDetails DetailsView és AllSuppliersDataSource ObjectDataSource konfigurálása után a következő deklaratív jelölés jelenik meg:

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

Ezen a ponton a DetailsView átlapozható, és a kiválasztott szállító címének információi frissíthetők, függetlenül attól, hogy milyen választás történt a legördülő listában Suppliers (lásd a 6. ábrát).

A szállítók adatai megtekinthetők, és címük frissítve van

6. ábra: Bármely szállítói információ megtekinthető, és a címe frissíthető (kattintson ide a teljes méretű kép megtekintéséhez)

3. lépés: Csak a kiválasztott szállító adatainak megjelenítése

Lapunk jelenleg az összes szállító adatait jeleníti meg, függetlenül attól, hogy egy adott szállító ki van-e jelölve a Suppliers legördülő listából. Ahhoz, hogy csak a kiválasztott szállító szállítói adatait jelenítsük meg, egy másik ObjectDataSource-t kell hozzáadnunk az oldalunkhoz, amely egy adott szállító adatait kéri le.

Adjon hozzá egy új ObjectDataSource-t a laphoz, elnevezve azt SingleSupplierDataSource. Az intelligens címkén kattintson az Adatforrás konfigurálása hivatkozásra, és használja az SuppliersBLL osztály GetSupplierBySupplierID(supplierID) metódusát. Az ObjectDataSource-hoz AllSuppliersDataSource hasonlóan az SingleSupplierDataSource ObjectDataSource metódust Update() is az SuppliersBLL osztály metódusához UpdateSupplierAddress kell hozzárendelni.

A SingleSupplierDataSource ObjectDataSource konfigurálása a GetSupplierBySupplierID(supplierID) metódus használatára

7. ábra: Konfigurálja az SingleSupplierDataSource ObjectDataSource-t a GetSupplierBySupplierID(supplierID) metódus használatára (kattintson ide a teljes méretű kép megtekintéséhez)

Ezután a rendszer kéri, hogy adja meg a metódus bemeneti paraméterének GetSupplierBySupplierID(supplierID) paraméterforrását supplierID . Mivel meg szeretnénk jeleníteni a DropDownList listából kiválasztott szállító adatait, használja a Suppliers DropDownList s tulajdonságát SelectedValue paraméterforrásként.

A Szállítók legördülő lista használata szállítóazonosító paraméterforrásként

8. ábra: A legördülő lista használata Suppliers paraméterforrásként supplierID (kattintson ide a teljes méretű kép megtekintéséhez)

Még a második ObjectDataSource hozzáadása esetén is a DetailsView vezérlő jelenleg úgy van konfigurálva, hogy mindig az AllSuppliersDataSource ObjectDataSource-t használja. A DetailsView által használt adatforrás módosításához logikát kell hozzáadnunk a Suppliers kiválasztott Legördülő lista elemtől függően. Ehhez hozzon létre egy eseménykezelőt SelectedIndexChanged a Szállítók legördülő listához. Ez a legegyszerűbben úgy hozható létre, ha duplán kattint a Tervező legördülő listájára. Az eseménykezelőnek meg kell határoznia, hogy milyen adatforrást használjon, és újra kell az adatokat a DetailsView-hoz szinkronizálnia. Ez a következő kóddal történik:

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();
}

Az eseménykezelő a "Show/Edit ALL Suppliers" (Minden szállító megjelenítése/szerkesztése) lehetőség kiválasztásával kezdődik. Ha így volt, akkor a SupplierDetails DetailsView s DataSourceID beállítása AllSuppliersDataSource értékre történik, és a felhasználót a szállítók halmazának első rekordjára viszi vissza, a PageIndex tulajdonságot 0 értékre állítva. Ha azonban a felhasználó kiválasztott egy adott szállítót a DropDownList listából, a DetailsView s DataSourceID hozzá lesz rendelve SingleSuppliersDataSource. Függetlenül attól, hogy milyen adatforrást használ, a rendszer visszaállítja a SuppliersDetails módot az írásvédett módba, és az adatok visszakerülnek a DetailsView-ba a SuppliersDetails vezérlő metódusának DataBind() hívásával.

Ezzel az eseménykezelővel a DetailsView vezérlő most megjeleníti a kiválasztott szállítót, kivéve, ha a "Minden szállító megjelenítése/szerkesztése" lehetőség van kiválasztva, ebben az esetben az összes szállító megtekinthető a lapozófelületen keresztül. A 9. ábrán a "Minden szállító megjelenítése/szerkesztése" lehetőség van kiválasztva; vegye figyelembe, hogy a lapozófelület jelen van, így a felhasználó felkeresheti és frissítheti a szállítót. A 10. ábra az oldalt mutatja, amikor a Ma Maison szállító van kiválasztva. Ebben az esetben csak Ma Maison adatai tekinthetők meg és szerkeszthetők.

Az összes szállítói információ megtekinthető és szerkeszthető

9. ábra: Az összes szállítói információ megtekinthető és szerkeszthető (kattintson ide a teljes méretű kép megtekintéséhez)

Csak a kijelölt szállító adatai tekinthetők meg és szerkeszthetők

10. ábra: Csak a kijelölt szállító adatai tekinthetők meg és szerkeszthetők (kattintson ide a teljes méretű kép megtekintéséhez)

Megjegyzés:

Ebben az oktatóanyagban mind a DropDownList, mind a DetailsView vezérlőt EnableViewState (az alapértelmezett) értékre true kell állítani, mert a DropDownList s SelectedIndex és a DetailsView DataSourceID tulajdonság módosításait a postbackek között meg kell jegyezni.

4. lépés: A szállítók termékeinek listázása szerkeszthető GridView-ban

A DetailsView befejeztével a következő lépésünk egy szerkeszthető GridView, amely felsorolja a kiválasztott szállító által biztosított termékeket. Ez a GridView csak a ProductName és QuantityPerUnit mezők szerkesztését kellene engedélyezze. Továbbá, ha az oldalt látogató felhasználó egy adott szállítótól származik, csak azoknak a termékeknek a frissítéseit engedélyezze, amelyek nem szűntek meg. Ehhez először hozzá kell adnunk az ProductsBLL osztály s UpdateProducts metódusának túlterhelését, amely csak a ProductID, ProductName és QuantityPerUnit mezőket veszi bemenetként. Ezt a folyamatot már korábban is végigjártuk számos oktatóanyagban, ezért nézzük meg itt a kódot, amelyet hozzá kell adni a következőhöz 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;
}

Ezzel a túlterheléssel készen állunk a GridView vezérlő és a hozzá tartozó ObjectDataSource hozzáadására. Adjon hozzá egy új GridView-t a laphoz, állítsa be a tulajdonságát ID-ra ProductsBySupplier, és konfigurálja úgy, hogy egy új ProductsBySupplierDataSource nevű ObjectDataSource-t használjon. Mivel azt szeretnénk, hogy ez a GridView felsorolja ezeket a termékeket a kiválasztott szállító szerint, használja az ProductsBLL s osztály metódust GetProductsBySupplierID(supplierID) . Térképezzük fel a(z) Update() metódust az imént létrehozott UpdateProduct új túlterhelésre is.

Az ObjectDataSource konfigurálása az imént létrehozott UpdateProduct metódustúlterhelés használatára

11. ábra: Konfigurálja az ObjectDataSource-t az UpdateProduct imént létrehozott túlterhelés használatára (kattintson ide a teljes méretű kép megtekintéséhez)

A rendszer kéri, hogy válassza ki a paraméter forrását a GetProductsBySupplierID(supplierID) metódus bemeneti paraméteréhez supplierID . Mivel a DetailsView-ban kiválasztott szállító termékeit szeretnénk megjeleníteni, használja a SuppliersDetails DetailsView vezérlő tulajdonságát SelectedValue paraméterforrásként.

A SuppliersDetails DetailsView s SelectedValue tulajdonság használata paraméterforrásként

12. ábra: A DetailsView tulajdonság SuppliersDetails használata SelectedValue paraméterforrásként (ide kattintva megtekintheti a teljes méretű képet)

A GridView-be visszatérve távolítsa el az összes GridView-mezőt, kivéve a ProductName, QuantityPerUnit, és Discontinued mezőket, valamint jelölje meg a Discontinued jelölőnégyzet mezőt írásvédettként. Ellenőrizze a Szerkesztés engedélyezése opciót a GridView intelligens címkéjében. A módosítások elvégzése után a GridView és az ObjectDataSource deklaratív korrektúrának az alábbiakhoz hasonlóan kell kinéznie:

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

A korábbi ObjectDataSources-hoz hasonlóan ez OldValuesParameterFormatString a tulajdonság is a következőre original_{0}van állítva, ami problémákat fog okozni egy termék nevének vagy mennyiségének egységenkénti frissítésekor. Távolítsa el ezt a tulajdonságot a deklaratív szintaxisból, vagy állítsa be az alapértelmezett értékre. {0}

Ezzel a konfigurációval a lap most felsorolja a GridView-ban kiválasztott szállító által biztosított termékeket (lásd a 13. ábrát). Jelenleg minden termék neve vagy mennyisége egységenként frissíthető. Frissíteni kell azonban az oldal működését, hogy az adott szállítóhoz társított felhasználók számára tiltott legyen az ilyen funkciók használata a megszüntetett termékek esetében. Ezt az utolsó részt az 5. lépésben fogjuk kezelni.

A kiválasztott szállító által biztosított termékek megjelennek

13. ábra: A kiválasztott szállító által biztosított termékek jelennek meg (kattintson ide a teljes méretű kép megtekintéséhez)

Megjegyzés:

A szerkeszthető GridView hozzáadásával a Suppliers DropDownList eseménykezelőjét SelectedIndexChanged úgy kell frissíteni, hogy a GridView visszakerüljön írásvédett állapotba. Ellenkező esetben, ha egy másik szállító van kiválasztva a termékinformációk szerkesztése közben, az új szállítóhoz tartozó GridView megfelelő indexe is szerkeszthető lesz. Ennek megakadályozásához egyszerűen állítsa be a GridView tulajdonságát EditIndex-1 az SelectedIndexChanged eseménykezelőbe.

Ne feledje továbbá, hogy fontos, hogy a GridView nézetállapota engedélyezve legyen (az alapértelmezett viselkedés). Ha a GridView tulajdonságot úgy állítja EnableViewState be, hogy false az egyidejű felhasználók véletlenül törölnek vagy szerkesztenek rekordokat.

5. lépés: A megszűnt termékek szerkesztésének letiltása, ha az ÖSSZES szállító megjelenítése/szerkesztése nincs kiválasztva

Bár a ProductsBySupplier GridView teljes mértékben működőképes, jelenleg túl sok hozzáférést biztosít azoknak a felhasználóknak, akik egy adott szállítótól származnak. Üzleti szabályaink szerint az ilyen felhasználók nem frissíthetik a megszűnt termékeket. Ennek kényszerítéséhez elrejthetjük (vagy letilthatjuk) a Szerkesztés gombot azokban a GridView-sorokban, amelyekben megszűnt termékek találhatók, amikor egy felhasználó felkeresi az oldalt egy szállítótól.

Hozzon létre egy eseménykezelőt a GridView-eseményhez RowDataBound . Ebben az eseménykezelőben meg kell határoznunk, hogy a felhasználó egy adott szállítóhoz van-e társítva, amely ebben az oktatóanyagban a Szállítók legördülő lista SelectedValue tulajdonságának ellenőrzésével határozható meg – ha nem -1, akkor a felhasználó egy adott szállítóhoz van társítva. Az ilyen felhasználók esetében ezt követően meg kell határoznunk, hogy a termék megszűnt-e. A ProductRow tulajdonság segítségével megkaphatjuk a GridView sorhoz kötött tényleges e.Row.DataItem példányra mutató hivatkozást, ahogyan az a Összefoglaló információk megjelenítése a GridView láblécében című oktatóanyagban ismertetésre került. Ha a termék megszűnt, a GridView CommandField Szerkesztés gombjára mutató programozott hivatkozást kaphatunk az előző oktatóanyagban ismertetett technikákkal, Client-Side törléskor történő megerősítés hozzáadásával. Miután rendelkezünk egy hivatkozással, elrejthetjük vagy letilthatjuk a gombot.

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

Ezzel az eseménykezelővel, amikor egy adott szállító felhasználójaként látogatja meg ezt a lapot, azok a termékek, amelyek megszűntek, nem szerkeszthetők, mivel a Szerkesztés gomb rejtve van ezekhez a termékekhez. Például, Chef Anton s Gumbo Mix egy megszűnt termék a New Orleans Cajun Delights szállító. Az adott szállító oldalának felkeresésekor a termék Szerkesztés gombja rejtett a szem elől (lásd a 14. ábrát). A "Show/Edit ALL Suppliers" (Minden szállító megjelenítése/szerkesztése) funkció használatakor azonban elérhető a Szerkesztés gomb (lásd a 15. ábrát).

Supplier-Specific felhasználók számára a Chef Anton s Gumbo Mix Szerkesztés gombja rejtett

14. ábra: A Supplier-Specific felhasználók számára a Chef Anton s Gumbo Mix szerkesztési gombja rejtett (kattintson a teljes méretű kép megtekintéséhez)

Az ÖSSZES beszállítói felhasználó megjelenítése/szerkesztése esetén megjelenik Anton Chef s Gumbo Mix szerkesztési gombja

15. ábra: Az ÖSSZES beszállítói felhasználó megjelenítése/szerkesztése esetén megjelenik a Chef Anton s Gumbo Mix szerkesztési gombja (kattintson ide a teljes méretű kép megtekintéséhez)

Hozzáférési jogosultságok ellenőrzése az üzleti logikai rétegben

Ebben az oktatóanyagban a ASP.NET oldal kezeli az összes logikát annak tekintetében, hogy a felhasználó milyen információkat láthat, és milyen termékeket frissíthet. Ideális esetben ez a logika az üzleti logikai rétegben is jelen lenne. Az osztály s SuppliersBLL metódusa (amely az összes szállítót visszaadja) tartalmazhat például GetSuppliers() egy ellenőrzést, amely ellenőrzi, hogy a jelenleg bejelentkezett felhasználó nincs-e társítva egy adott szállítóval. Hasonlóképpen, a UpdateSupplierAddress módszer tartalmazhat egy ellenőrzést is annak biztosítására, hogy a jelenleg bejelentkezett felhasználó vagy a vállalatnál dolgozott (és így frissítheti az összes szállító címadatait), vagy ahhoz a szállítóhoz van társítva, akinek az adatai frissülnek.

Nem tartalmaztam ilyen BLL-rétegbeli ellenőrzéseket, mert az oktatóanyagban a felhasználói jogosultságokat az oldalon található legördülő lista határozza meg, amelyhez a BLL-osztályok nem férnek hozzá. A tagsági rendszer vagy a ASP.NET által biztosított beépített hitelesítési sémák (például Windows-hitelesítés) használatakor a jelenleg bejelentkezett felhasználói adatok és szerepkörök adatai a BLL-ből érhetők el, így a hozzáférési jogosultságok ellenőrzése a bemutató és a BLL-rétegeken is lehetővé válik.

Összefoglalás

A felhasználói fiókokat biztosító webhelyek többségének testre kell szabnia az adatmódosítási felületet a bejelentkezett felhasználó alapján. A rendszergazda felhasználók bármilyen rekordot törölhetnek és szerkeszthetnek, míg a nem rendszergazdai felhasználók csak a maguk által létrehozott rekordok frissítésére vagy törlésére korlátozódhatnak. Bármilyen forgatókönyv is legyen, az adat webes vezérlői, az ObjectDataSource és az üzleti logikai réteg osztályai kiterjeszthetők bizonyos funkciók hozzáadására vagy letiltására a bejelentkezett felhasználó alapján. Ebben az oktatóanyagban azt láttuk, hogyan korlátozhatjuk a megtekinthető és szerkeszthető adatokat attól függően, hogy a felhasználó egy adott szállítóhoz van-e társítva, vagy hogy a vállalatnál dolgoztak-e.

Ez az oktatóanyag az adatok GridView, DetailsView és FormView vezérlőkkel történő beszúrásának, frissítésének és törlésének vizsgálatát zárja. A következő oktatóanyagtól kezdve a lapozási és rendezési támogatás hozzáadására fordítjuk a figyelmünket.

Boldog programozást!

Tudnivalók a szerzőről

Scott Mitchell, hét ASP/ASP.NET-könyv szerzője és a 4GuysFromRolla.com alapítója, 1998 óta dolgozik a Microsoft webtechnológiáival. Scott független tanácsadóként, edzőként és íróként dolgozik. Legújabb könyve Sams Tanulja meg az ASP.NET 2.0-t 24 óra alatt. Itt érhető el mitchell@4GuysFromRolla.com.