Sdílet prostřednictvím


Omezení funkcí pro úpravu dat podle uživatele (VB)

od Scott Mitchell

Stáhnout PDF

Ve webové aplikaci, která umožňuje uživatelům upravovat data, můžou mít různé uživatelské účty různá oprávnění pro úpravy dat. V tomto kurzu se podíváme, jak dynamicky upravit možnosti úprav dat na základě navštíveného uživatele.

Úvod

Řada webových aplikací podporuje uživatelské účty a na základě přihlášeného uživatele poskytuje různé možnosti, zprávy a funkce. V našich kurzech bychom například mohli chtít uživatelům z dodavatelů umožnit přihlášení na web a aktualizaci obecných informací o svých produktech – jejich jména a množství na jednotku , možná – spolu s informacemi o dodavateli, jako je název společnosti, adresa, kontaktní osoba atd. Kromě toho můžeme chtít zahrnout některé uživatelské účty pro lidi z naší společnosti, aby se mohli přihlásit a aktualizovat informace o produktech, jako jsou jednotky na skladě, změna pořadí atd. Naše webová aplikace může také umožnit anonymním uživatelům, aby navštívili (osoby, které nejsou přihlášené), ale omezily by je jenom na prohlížení dat. U takového systému uživatelských účtů bychom chtěli, aby datové webové ovládací prvky na našich ASP.NET stránkách nabízely možnosti vkládání, úprav a odstraňování, které jsou vhodné pro aktuálně přihlášeného uživatele.

V tomto kurzu se podíváme, jak dynamicky upravit možnosti úprav dat na základě navštíveného uživatele. Konkrétně vytvoříme stránku, která zobrazí informace o dodavatelích v upravitelném prvku DetailsView spolu s Objektem GridView se seznamem produktů poskytovaných dodavatelem. Pokud uživatel, který stránku navštíví, pochází z naší společnosti, může: zobrazit jakékoli informace o dodavateli; upravit jejich adresu; a upravte informace o jakémkoli produktu poskytnutém dodavatelem. Pokud je ale uživatel od určité společnosti, může zobrazit a upravit pouze své vlastní informace o adrese a může upravovat jenom produkty, které nebyly označeny jako ukončené.

Uživatel z naší společnosti může upravit jakékoli informace o dodavateli.

Obrázek 1: Uživatel z naší společnosti může upravit jakékoli informace o dodavateli (kliknutím zobrazíte obrázek v plné velikosti).

Uživatel od konkrétního dodavatele může zobrazit a upravit pouze své informace

Obrázek 2: Uživatel od konkrétního dodavatele může zobrazit a upravit pouze své informace (kliknutím zobrazíte obrázek v plné velikosti).

Pojďme začít!

Poznámka:

systém členství ASP.NET 2.0 poskytuje standardizovanou, rozšiřitelnou platformu pro vytváření, správu a ověřování uživatelských účtů. Protože zkoumání systému členství je nad rámec těchto kurzů, tento kurz místo toho simuluje členství tím, že umožňuje anonymním návštěvníkům vybrat, zda jsou z konkrétního dodavatele nebo z naší společnosti. Další informace o členství naleznete v sérii článků Examining ASP.NET 2.0 s Membership, Roles, and Profile.

Krok 1: Povolení zadání přístupových práv uživateli

V reálné webové aplikaci by informace o účtu uživatele zahrnovaly, jestli pracoval pro naši společnost nebo pro konkrétního dodavatele, a tyto informace by byly programově přístupné z našich ASP.NET stránek, jakmile se uživatel přihlásí k webu. Tyto informace je možné zachytit prostřednictvím systému rolí ASP.NET 2.0, jako informace o účtu na úrovni uživatele prostřednictvím systému profilů nebo prostřednictvím některých vlastních prostředků.

Vzhledem k tomu, že cílem tohoto kurzu je předvést úpravu možností úprav dat na základě přihlášeného uživatele a nemá za cíl prezentovat ASP.NET 2.0 členství, rolí a profilových systémů, použijeme velmi jednoduchý mechanismus k určení možností pro uživatele, který navštíví stránku – rozevírací seznam, ze kterého může uživatel určit, jestli by měl mít možnost zobrazit a upravit některé z informací o dodavatelích, nebo, případně informace o konkrétních dodavateli, které můžou zobrazit a upravit. Pokud uživatel zjistí, že může zobrazit a upravit všechny informace o dodavateli (výchozí nastavení), může procházet všechny dodavatele, upravovat informace o adrese libovolného dodavatele a upravovat název a množství na jednotku pro jakýkoli produkt poskytnutý vybraným dodavatelem. Pokud uživatel zjistí, že může zobrazit a upravit pouze konkrétního dodavatele, může zobrazit pouze podrobnosti a produkty pro daného dodavatele a může aktualizovat pouze název a množství informací o jednotlivých jednotkách pro tyto produkty, které nejsou ukončeny.

Naším prvním krokem v tomto návodu je vytvořit tento rozevírací seznam a naplnit ho dodavateli v systému. UserLevelAccess.aspx Otevřete stránku ve EditInsertDelete složce, přidejte DropDownList, jehož ID vlastnost je nastavena na Suppliers, a vytvořte vazbu tohoto DropDownList na nový ObjectDataSource pojmenovaný AllSuppliersDataSource.

Vytvoření nového objektu ObjectDataSource s názvem AllSuppliersDataSource

Obrázek 3: Vytvoření nového objektu ObjectDataSource s názvem AllSuppliersDataSource (kliknutím zobrazíte obrázek s plnou velikostí)

Vzhledem k tomu, že chceme, aby tento DropDownList zahrnoval všechny dodavatele, nakonfigurujte ObjectDataSource tak, aby vyvolal metodu SuppliersBLL třídy GetSuppliers(). Také se ujistěte, že metoda ObjectDataSource s Update() je mapována na metodu třídy SuppliersBLL s UpdateSupplierAddress, protože tento ObjectDataSource bude také používán v režimu DetailsView, který budeme přidávat v kroku 2.

Po dokončení průvodce ObjectDataSource dokončete kroky konfigurací Suppliers DropDownList tak, aby zobrazoval CompanyName datové pole a používá SupplierID datové pole jako hodnotu pro každý ListItem.

Konfigurace rozevíracího seznamu Dodavatelé pro použití polí Data CompanyName a SupplierID

Obrázek 4: Konfigurace rozevíracího Suppliers seznamu tak, aby používala CompanyName pole a SupplierID datová pole (kliknutím zobrazíte obrázek v plné velikosti)

V tomto okamžiku rozevírací seznam uvádí názvy společností dodavatelů v databázi. Musíme ale také do rozevíracího seznamu zahrnout možnost Zobrazit/upravit všechny dodavatele. Chcete-li toho dosáhnout, nastavte vlastnost Suppliers u AppendDataBoundItems DropDownList na true a pak přidejte ListItem, u kterého je vlastnost Text „Show/Edit ALL Suppliers“ a jeho hodnota je -1. To lze přidat přímo prostřednictvím deklarativní značky nebo prostřednictvím Návrháře tak, že přejdete do okna Vlastnosti a kliknete na tři tečky ve vlastnosti DropDownList s Items .

Poznámka:

Podrobnější diskuzi o přidání položky Vybrat vše do datově svázaného rozbalovacího seznamu najdete v kurzu Master/Detail Filtering With a DropDownList.

Po nastavení AppendDataBoundItems vlastnosti a přidání ListItem by deklarativní značkování DropDownListu mělo vypadat takto:

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

Obrázek 5 ukazuje snímek obrazovky zobrazující náš aktuální pokrok při prohlížení v prohlížeči.

Rozevírací seznam dodavatelů obsahuje položku seznamu Zobrazit vše a k tomu ještě jednu pro každého dodavatele.

Obrázek 5: Suppliers Rozevírací seznam obsahuje položku 'Zobrazit všechny' ListItem, a navíc jednu položku pro každého dodavatele (kliknutím zobrazíte obrázek v plné velikosti).

Vzhledem k tomu, že chceme aktualizovat uživatelské rozhraní ihned po změně výběru uživatele, nastavte Suppliers DropDownList vlastnost AutoPostBack na true. V kroku 2 vytvoříme ovládací prvek DetailsView, který zobrazí informace pro dodavatele na základě výběru DropDownList. Potom v kroku 3 vytvoříme obslužnou rutinu události pro tuto událost DropDownList SelectedIndexChanged , ve které přidáme kód, který vytvoří vazbu odpovídajících informací o dodavateli na DetailsView na základě vybraného dodavatele.

Krok 2: Přidání ovládacího prvku DetailsView

Pojďme použít DetailsView k zobrazení informací o dodavateli. Pro uživatele, který může zobrazit a upravit všechny dodavatele, bude DetailsView podporovat stránkování, což uživateli umožní procházet informace o dodavateli po jednom záznamu. Pokud uživatel pracuje pro konkrétního dodavatele, zobrazí Podrobnosti pouze informace o tomto konkrétním dodavateli a nebude obsahovat žádné stránkovací rozhraní. V obou případech musí DetailsView uživateli povolit úpravu adresy dodavatele, města a polí země.

Přidat DetailsView na stránku pod Suppliers DropDownList, nastavit jeho ID vlastnost na SupplierDetailsa vytvořit vazbu na AllSuppliersDataSource ObjectDataSource vytvořený v předchozím kroku. Dále zaškrtněte políčka 'Povolit stránkování' a 'Povolit úpravy' z chytrého štítku DetailsView.

Poznámka:

Pokud v inteligentní značce DetailsView nevidíte možnost Povolit úpravy, je to proto, že jste metodu ObjectDataSource s Update() nenamapovali na metodu SuppliersBLL třídy s UpdateSupplierAddress . Vraťte se zpět a proveďte tuto změnu konfigurace, po které by se měla v smart tagu DetailsView zobrazit možnost Povolit úpravy.

Vzhledem k tomu, že metoda třídy SuppliersBLL s UpdateSupplierAddress přijímá pouze čtyři parametry - supplierID, address, city a country - upravte BoundFields v DetailsView tak, aby CompanyName a Phone BoundFields byly pouze pro čtení. Kromě toho odeberte SupplierID BoundField úplně. AllSuppliersDataSource A konečně ObjectDataSource má nyní jeho OldValuesParameterFormatString vlastnost nastavena na original_{0}. Chvíli odeberte toto nastavení vlastnosti z deklarativní syntaxe úplně nebo ho nastavte na výchozí hodnotu {0}.

Po dokončení konfigurace SupplierDetails DetailsView a AllSuppliersDataSource ObjectDataSource budeme mít následující deklarativní kód:

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

V tomto okamžiku lze DetailsView procházet a informace o adrese vybraného dodavatele lze aktualizovat bez ohledu na výběr provedený v rozevíracím Suppliers seznamu (viz obrázek 6).

Všechny informace o dodavatelích je možné zobrazit a aktualizovat její adresu.

Obrázek 6: Můžete zobrazit všechny informace o dodavatelích a jeho adresu aktualizovat (kliknutím zobrazíte obrázek v plné velikosti).

Krok 3: Zobrazení pouze informací o vybraném dodavateli

Naše stránka aktuálně zobrazuje informace pro všechny dodavatele bez ohledu na to, zda byl konkrétní dodavatel vybrán z rozevíracího Suppliers seznamu. Abychom mohli zobrazit jenom informace o dodavateli vybraného dodavatele, musíme na naši stránku přidat další ObjectDataSource, který načte informace o konkrétním dodavateli.

Přidejte na stránku nový ObjectDataSource a pojmenujte ho SingleSupplierDataSource. V inteligentní značce klikněte na odkaz Konfigurovat zdroj dat a použijte metodu SuppliersBLL třídy GetSupplierBySupplierID(supplierID) . Stejně jako AllSuppliersDataSource ObjectDataSource, má SingleSupplierDataSource ObjectDataSource Update() metodu namapovanou na metodu SuppliersBLL třídy UpdateSupplierAddress.

Konfigurace SingleSupplierDataSource ObjectDataSource pro použití metody GetSupplierBySupplierID(supplierID)

Obrázek 7: Konfigurace SingleSupplierDataSource ObjectDataSource pro použití GetSupplierBySupplierID(supplierID) metody (kliknutím zobrazíte obrázek s plnou velikostí)

Dále se zobrazí výzva k zadání zdroje parametrů pro GetSupplierBySupplierID(supplierID) vstupní parametr metody supplierID . Vzhledem k tomu, že chceme zobrazit informace pro dodavatele vybraného z DropDownList, použijte Suppliers vlastnost DropDownList s SelectedValue jako zdroj parametrů.

Použijte rozevírací seznam dodavatelů jako zdroj parametru supplierID

Obrázek 8: Použití rozevíracího SupplierssupplierID seznamu jako zdroje parametrů (kliknutím zobrazíte obrázek s plnou velikostí)

I s tímto druhým ObjectDataSource přidaným je ovládací prvek DetailsView aktuálně nakonfigurován, aby vždy používal AllSuppliersDataSource ObjectDataSource. Potřebujeme přidat logiku pro úpravu zdroje dat používaného objektem DetailsView v závislosti na Suppliers vybrané položce DropDownList. Chcete-li toho dosáhnout, vytvořte obslužnou rutinu SelectedIndexChanged události pro Supplier DropDownList. To lze nejjednodušeji vytvořit dvojklikem na DropDownList v Návrháři. Tato obslužná rutina události musí určit, jaký zdroj dat se má použít, a musí je znovu připojit k DetailsView. To se provádí pomocí následujícího kódu:

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

Obslužná rutina události začíná určením, zda byla vybrána možnost Zobrazit/Upravit VŠECHNY dodavatele. Pokud ano, nastaví SupplierDetails DetailsView s DataSourceID na AllSuppliersDataSource a vrátí uživatele k prvnímu záznamu v sadě dodavatelů tím, že nastaví vlastnost PageIndex na 0. Pokud však uživatel vybral konkrétního dodavatele z rozevíracího seznamu, DetailsView s DataSourceID je přiřazen k SingleSuppliersDataSource. Bez ohledu na to, jaký zdroj dat se používá, režim SuppliersDetails se vrátí do režimu jen pro čtení a data se napojí na DetailsView voláním metody SuppliersDetails ovládacího prvku DataBind().

Když je tato obslužná rutina události na místě, ovládací prvek DetailsView nyní zobrazuje vybraného dodavatele, pokud nebyla vybrána možnost Zobrazit/Upravit VŠECHNY dodavatele, v takovém případě je možné zobrazit všechny dodavatele prostřednictvím stránkovacího rozhraní. Obrázek 9 zobrazuje stránku s vybranou možností Zobrazit/Upravit všechny dodavatele; upozorňujeme, že stránkovací rozhraní je k dispozici, což uživateli umožňuje navštívit a aktualizovat libovolného dodavatele. Obrázek 10 ukazuje stránku s vybraným dodavatelem Ma Maison. V tomto případě lze zobrazit a upravit pouze informace Ma Maison s.

Všechny informace o dodavatelích je možné zobrazit a upravit.

Obrázek 9: Všechny informace o dodavatelích lze zobrazit a upravit (kliknutím zobrazíte obrázek v plné velikosti).

Lze zobrazit a upravit pouze informace vybraného dodavatele.

Obrázek 10: Zobrazit a upravit pouze informace o vybraném dodavateli (kliknutím zobrazíte obrázek s plnou velikostí)

Poznámka:

Pro účely tohoto kurzu musí být ovládací prvky EnableViewState DropDownList i DetailsView nastaveny na true (výchozí), protože změny vlastností DropDownList s SelectedIndex a DetailsView s DataSourceID musí být zapamatovány napříč postbacky.

Krok 4: Výpis produktů dodavatelů v upravitelném objektu GridView

Po dokončení DetailsView je dalším krokem zahrnutí upravitelného objektu GridView se seznamem produktů poskytovaných vybraným dodavatelem. Tento objekt GridView by měl umožňovat úpravy pouze pro ProductName pole a QuantityPerUnit pole. Navíc pokud uživatel, který stránku navštíví, pochází od konkrétního dodavatele, měl by povolit pouze aktualizace těchto produktů, které nejsou ukončeny. Abychom toho dosáhli, musíme nejprve přidat přetížení metody ProductsBLL třídy UpdateProducts, která přebírá pouze pole ProductID, ProductName a QuantityPerUnit jako vstupy. Tento proces jsme si prošli předem v mnoha kurzech, takže se pojďme podívat na kód zde, který by se měl přidat do 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

S vytvořeným přetížením jsme nyní připraveni přidat ovládací prvek GridView a jeho přidružený ObjectDataSource. Přidejte na stránku nový Objekt GridView, nastavte jeho ID vlastnost na ProductsBySuppliera nakonfigurujte jej tak, aby používal nový ObjectDataSource s názvem ProductsBySupplierDataSource. Použijte metodu ProductsBLL třídy GetProductsBySupplierID(supplierID), protože chceme, aby GridView vypsal produkty podle vybraného dodavatele. Namapujte také metodu Update() na nové UpdateProduct přetížení, které jsme právě vytvořili.

Nakonfigurujte ObjectDataSource pro použití přetížení UpdateProduct, které bylo právě vytvořeno

Obrázek 11: Konfigurace ObjectDataSource pro použití právě vytvořené přetížení UpdateProduct (kliknutím zobrazíte obrázek plné velikosti)

Zobrazí se výzva k výběru zdroje parametrů pro GetProductsBySupplierID(supplierID) vstupní parametr metody supplierID . Vzhledem k tomu, že chceme zobrazit produkty pro dodavatele vybraného v DetailsView, použijte SuppliersDetails vlastnost DetailsView ovládacího prvku SelectedValue jako zdroj parametrů.

Použijte vlastnost SelectedValue v DetailsView objektu SuppliersDetails jako zdroj parametru

Obrázek 12: Použití SuppliersDetails vlastnosti DetailsView s SelectedValue jako zdroje parametrů (kliknutím zobrazíte obrázek v plné velikosti)

Vraťte se do GridView, odeberte všechna pole GridView s výjimkou ProductName, QuantityPerUnit a Discontinued, a označte Discontinued CheckBoxField jako jen pro čtení. Také zkontrolujte možnost Povolit úpravy ze Smart Tagu GridView. Po provedení těchto změn by deklarativní kód pro GridView a ObjectDataSource měl vypadat podobně jako následující:

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

Stejně jako u našeho předchozího ObjectDataSources je tato jedna OldValuesParameterFormatString vlastnost nastavena na original_{0}, což způsobí problémy při pokusu o aktualizaci názvu produktu nebo množství na jednotku. Odeberte tuto vlastnost z deklarativní syntaxe úplně nebo ji nastavte na výchozí hodnotu . {0}

Po dokončení této konfigurace teď naše stránka uvádí produkty poskytované dodavatelem vybraným v Objektu GridView (viz obrázek 13). V současné době je možné aktualizovat jakýkoli název produktu nebo množství na jednotku. Musíme ale aktualizovat logiku stránky tak, aby tyto funkce byly zakázány pro ukončené produkty pro uživatele spojené s konkrétním dodavatelem. V kroku 5 se budeme zabývat tímto posledním dílem.

Zobrazí se produkty poskytované vybraným dodavatelem.

Obrázek 13: Zobrazí se produkty poskytované vybraným dodavatelem (kliknutím zobrazíte obrázek s plnou velikostí).

Poznámka:

S přidáním této upravitelné GridView Suppliers DropDownList s SelectedIndexChanged obslužná rutina události by měla být aktualizována tak, aby vrátil GridView do stavu jen pro čtení. V opačném případě, pokud je v průběhu úprav informací o produktu vybrán jiný dodavatel, bude také možné upravit odpovídající index v objektu GridView pro nového dodavatele. Chcete-li tomu zabránit, jednoduše nastavte vlastnost EditIndex objektu GridView v obslužné rutině -1 události SelectedIndexChanged.

Připomínáme také, že je důležité povolit stav zobrazení GridView (výchozí chování). Pokud nastavíte vlastnost EnableViewState GridView na false, podstupujete riziko, že souběžní uživatelé neúmyslně odstraní nebo upraví záznamy.

Krok 5: Zakázání úprav ukončených produktů, pokud není vybrána možnost Zobrazit/Upravit všechny dodavatele

ProductsBySupplier I když je GridView plně funkční, v současné době uděluje příliš mnoho přístupu uživatelům, kteří jsou od konkrétního dodavatele. Podle našich obchodních pravidel by tito uživatelé neměli být schopni aktualizovat ukončené produkty. Abychom to vynutili, můžeme skrýt (nebo zakázat) tlačítko Upravit v těchto řádcích GridView s ukončenými produkty při návštěvě stránky uživatelem od dodavatele.

Vytvořte obslužnou rutinu události pro událost GridView s RowDataBound . V této obslužné rutině události musíme určit, zda je uživatel přidružený ke konkrétnímu dodavateli, který může být pro účely tohoto kurzu určen kontrolou vlastnosti Suppliers DropDownList SelectedValue - pokud je něco jiného než -1, pak je uživatel přidružený k určitému dodavateli. Pro takové uživatele pak musíme určit, jestli je produkt ukončen nebo ne. Můžeme získat odkaz na skutečnou ProductRow instanci vázanou na řádek GridView prostřednictvím e.Row.DataItem vlastnosti, jak je popsáno v tutoriálu Zobrazení souhrnných informací v zápatí GridView. Pokud je produkt vyřazen z nabídky, můžeme získat programový odkaz na tlačítko "Upravit" v GridView s polem příkazů CommandField pomocí technik probíraných v předchozím kurzu Přidání Client-Side Potvrzení Při Odstranění. Jakmile budeme mít odkaz, můžeme tlačítko skrýt nebo zakázat.

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

Když je tato obslužná rutina události aktivní, při návštěvě této stránky jako uživatel od konkrétního dodavatele nelze upravovat produkty, které byly ukončeny, protože tlačítko Upravit je pro tyto produkty skryté. Chef Anton's Gumbo Mix je například ukončený produkt dodavatele New Orleans Cajun Delights. Při návštěvě stránky pro tohoto konkrétního dodavatele je tlačítko Upravit pro tento produkt skryto v dohledu (viz obrázek 14). Při návštěvě pomocí možnosti Zobrazit/Upravit všechny dodavatele je však k dispozici tlačítko Upravit (viz obrázek 15).

Pro uživatele Supplier-Specific je tlačítko Upravit pro Chef Antonův Gumbo Mix skryté

Obrázek 14: Pro uživatele Supplier-Specific je tlačítko Upravit pro Chef Anton's Gumbo Mix skryté (Kliknutím zobrazíte obrázek v plné velikosti)

Pro zobrazení/úpravy uživatelů všech dodavatelů je zobrazeno tlačítko pro úpravu Chef Anton's Gumbo Mix

Obrázek 15: U uživatelů zobrazit/upravit všechny dodavatele se zobrazí tlačítko Upravit pro Chef Anton s Gumbo Mix (kliknutím zobrazíte obrázek v plné velikosti).

Kontrola přístupových práv ve vrstvě obchodní logiky

V tomto kurzu stránka ASP.NET zpracovává veškerou logiku s ohledem na informace, které může uživatel zobrazit a jaké produkty může aktualizovat. V ideálním případě by tato logika byla přítomna také ve vrstvě obchodní logiky. Například SuppliersBLL metoda třídy GetSuppliers() (která vrací všechny dodavatele) může obsahovat kontrolu, která zajistí, že aktuálně přihlášený uživatel není přidružený ke konkrétnímu dodavateli. UpdateSupplierAddress Metoda může také zahrnovat kontrolu, která zajistí, že aktuálně přihlášený uživatel pracoval pro naši společnost (a proto může aktualizovat všechny informace o adrese dodavatelů) nebo je přidružený k dodavateli, jehož data se aktualizují.

Nezahrnul jsem sem takové kontroly BLL-vrstvy, protože v našem tutoriálu jsou uživatelská práva určena pomocí DropDownList na stránce, ke které třídy BLL nemají přístup. Při použití systému členství nebo některého z předefinovaných schémat ověřování, která poskytuje ASP.NET (například ověřování systému Windows), mohou být aktuálně přihlášené informace o uživatelích a rolích přístupné z BLL, což umožňuje takové kontroly přístupových práv na úrovni prezentace i BLL.

Shrnutí

Většina webů, které poskytují uživatelské účty, musí přizpůsobit rozhraní pro úpravu dat na základě přihlášeného uživatele. Správci mohou být schopni odstranit a upravit jakýkoli záznam, zatímco uživatelé, kteří nejsou správci, mohou být omezeni pouze na aktualizaci nebo odstranění záznamů, které sami vytvořili. Bez ohledu na to, jaký scénář může nastat, třídy Web kontrol, ObjectDataSource a vrstva obchodní logiky lze rozšířit o přidání nebo zamítnutí určitých funkcí na základě přihlášeného uživatele. V tomto kurzu jsme viděli, jak omezit zobrazitelná a upravitelná data v závislosti na tom, jestli byl uživatel přidružený k určitému dodavateli nebo jestli pracoval pro naši společnost.

V tomto kurzu se dozvíte, jak vložit, aktualizovat a odstranit data pomocí ovládacích prvků GridView, DetailsView a FormView. Od dalšího kurzu se podíváme na přidání podpory stránkování a řazení.

Šťastné programování!

O autorovi

Scott Mitchell, autor sedmi knih ASP/ASP.NET a zakladatel 4GuysFromRolla.com, pracuje s webovými technologiemi Microsoftu od roku 1998. Scott pracuje jako nezávislý konzultant, trenér a spisovatel. Jeho nejnovější kniha je Sams Naučte se sami ASP.NET 2.0 během 24 hodin. Může být dosažitelný na mitchell@4GuysFromRolla.comadrese .