Udostępnij za pomocą


Ograniczanie funkcji modyfikacji danych na podstawie użytkownika (C#)

Autor : Scott Mitchell

Pobierz plik PDF

W aplikacji internetowej, która umożliwia użytkownikom edytowanie danych, różne konta użytkowników mogą mieć różne uprawnienia do edycji danych. W tym samouczku zbadamy, jak dynamicznie dostosowywać możliwości modyfikacji danych w zależności od odwiedzającego użytkownika.

Wprowadzenie

Wiele aplikacji internetowych obsługuje konta użytkowników i udostępnia różne opcje, raporty i funkcje na podstawie zalogowanego użytkownika. Na przykład w naszych samouczkach możemy zezwolić użytkownikom z firm dostawcy na logowanie się do witryny i zaktualizować ogólne informacje o swoich produktach — ich imię i nazwisko i ilość na jednostkę, na przykład — wraz z informacjami o dostawcy, takimi jak nazwa firmy, adres, informacje o osobach kontaktowych itd. Ponadto możemy chcieć utworzyć niektóre konta użytkowników dla osób z naszej firmy, aby mogli logować się i aktualizować informacje o produkcie, takie jak jednostki na stanie, poziom zamówień, itd. Nasza aplikacja internetowa może również zezwalać anonimowym użytkownikom na odwiedzanie (osób, które nie zalogowały się), ale ograniczyłoby je tylko do wyświetlania danych. Dzięki takiemu systemowi kont użytkowników chcemy, aby kontrolki danych Web na naszych stronach ASP.NET oferowały możliwości wstawiania, edytowania i usuwania odpowiednie dla obecnie zalogowanego użytkownika.

W tym samouczku zbadamy, jak dynamicznie dostosowywać możliwości modyfikacji danych w zależności od odwiedzającego użytkownika. W szczególności utworzymy stronę wyświetlającą informacje dostawców w edytowalnym widoku DetailsView wraz z kontrolką GridView zawierającą listę produktów dostarczonych przez dostawcę. Jeśli użytkownik odwiedzający stronę pochodzi z naszej firmy, może wyświetlać wszelkie informacje o dostawcy; edytuj swój adres; oraz zmodyfikuj informacje dotyczące dowolnego produktu dostarczonego przez dostawcę. Jeśli jednak użytkownik pochodzi z konkretnej firmy, może wyświetlać i edytować własne informacje o adresie i edytować tylko te produkty, które nie zostały oznaczone jako zakończone.

Użytkownik naszej firmy może edytować wszelkie informacje o dostawcy

Rysunek 1. Użytkownik z naszej firmy może edytować informacje o dostawcy (kliknij, aby wyświetlić obraz pełnowymiarowy)

Użytkownik z określonego dostawcy może tylko wyświetlać i edytować swoje informacje

Rysunek 2. Użytkownik z określonego dostawcy może wyświetlać i edytować swoje informacje (kliknij, aby wyświetlić obraz pełnowymiarowy)

Zacznijmy!

Uwaga / Notatka

system członkostwa ASP.NET 2.0 zapewnia ustandaryzowaną, rozszerzalną platformę do tworzenia kont użytkowników, zarządzania nimi i weryfikowania ich. Ponieważ badanie systemu członkostwa wykracza poza zakres tych samouczków, ten samouczek zamiast tego symuluje członkostwo, pozwalając anonimowym odwiedzającym wybrać, czy pochodzą od określonego dostawcy, czy z naszej firmy. Aby uzyskać więcej informacji na temat członkostwa, zapoznaj się z serią artykułów Analiza członkostwa, ról i profilów w ASP.NET 2.0.

Krok 1. Zezwolenie użytkownikowi na określanie praw dostępu

W rzeczywistej aplikacji internetowej informacje o koncie użytkownika obejmują informacje o tym, czy pracowali dla naszej firmy, czy dla konkretnego dostawcy, a te informacje byłyby programowo dostępne z naszych stron ASP.NET po zalogowaniu się użytkownika do witryny. Te informacje mogą być przechwytywane przez system ról ASP.NET 2.0, jako informacje o koncie na poziomie użytkownika za pośrednictwem systemu profilów lub za pośrednictwem niektórych niestandardowych środków.

Ponieważ celem tego samouczka jest zademonstrowanie dostosowywania możliwości modyfikacji danych na podstawie zalogowanego użytkownika i nie ma na celu zaprezentowania członkostwa ASP.NET 2.0, ról i systemów profilów, użyjemy bardzo prostego mechanizmu określania możliwości użytkownika odwiedzającego stronę — listy rozwijanej, z której użytkownik może wskazać, czy powinien być w stanie wyświetlać i edytować dowolne informacje dostawców lub, alternatywnie, jakie konkretne informacje dostawcy mogą wyświetlać i edytować. Jeśli użytkownik wskazuje, że może wyświetlać i edytować wszystkie informacje o dostawcy (wartość domyślna), może stronicować wszystkie dostawcy, edytować wszelkie informacje o adresie dostawcy oraz edytować nazwę i ilość na jednostkę dla dowolnego produktu dostarczonego przez wybranego dostawcę. Jeśli użytkownik wskazuje, że może tylko wyświetlać i edytować określonego dostawcę, a jednak może wyświetlać szczegóły i produkty wyłącznie dla tego jednego dostawcy i może aktualizować tylko nazwę i informacje o ilości na jednostkę dla tych produktów, które nie są wycofane.

Pierwszym krokiem w tym samouczku jest utworzenie tej listy rozwijanej i wypełnienie jej dostawcami w systemie. Otwórz stronę UserLevelAccess.aspx w folderze EditInsertDelete, dodaj element DropDownList, którego właściwość ID jest ustawiona na Suppliers, i powiąż tę listę rozwijaną z nowym ObjectDataSource o nazwie AllSuppliersDataSource.

Tworzenie nowego obiektu ObjectDataSource o nazwie AllSuppliersDataSource

Rysunek 3. Tworzenie nowego obiektuDataSource o nazwie AllSuppliersDataSource (kliknij, aby wyświetlić obraz o pełnym rozmiarze)

Ponieważ chcemy, aby ta lista DropDownList zawierała wszystkich dostawców, skonfiguruj obiekt ObjectDataSource, aby wywołać metodę SuppliersBLL klasy s GetSuppliers() . Upewnij się również, że metoda ObjectDataSource Update() odpowiada metodzie klasy SuppliersBLL, UpdateSupplierAddress ponieważ ten ObjectDataSource będzie również używany przez element DetailsView, który będziemy dodawać w kroku 2.

Po zakończeniu pracy kreatora ObjectDataSource, wykonaj kolejne kroki, konfigurując Suppliers listę DropDownList tak, aby wyświetlała pole danych CompanyName i używała pola danych SupplierID jako wartości dla każdego elementu ListItem.

Skonfiguruj listę rozwijaną dostawców do używania pól danych CompanyName i SupplierID

Rysunek 4: Skonfiguruj listę rozwijaną Suppliers do użycia pól CompanyName danych i SupplierID (Kliknij, aby wyświetlić obraz w pełnym rozmiarze)

W tym momencie lista rozwijana zawiera nazwy firm dostawców w bazie danych. Musimy jednak również dołączyć opcję "Pokaż/Edytuj wszystkich dostawców" do listy rozwijanej. Aby to osiągnąć, ustaw Suppliers właściwość DropDownList AppendDataBoundItems na true , a następnie dodaj ListItem właściwość, której Text właściwość to "Show/Edit ALL Suppliers" i której wartością jest -1. Można to dodać bezpośrednio poprzez znacznik deklaratywny lub za pośrednictwem narzędzia Designer, przechodząc do okna Właściwości i klikając na wielokropek we właściwości DropDownList Items.

Uwaga / Notatka

Zapoznaj się z tutorialem Filtrowanie wzorca/szczegółów za pomocą listy rozwijanej DropDownList (Master/Detail Filtering With a DropDownList), aby uzyskać bardziej szczegółową dyskusję na temat dodawania opcji "Zaznacz wszystko" do listy rozwijanej powiązanej z danymi.

Po ustawieniu właściwości AppendDataBoundItems i dodaniu ListItem, deklaratywny znacznik listy DropDownList powinien wyglądać następująco:

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

Rysunek 5 przedstawia zrzut ekranu przedstawiający bieżący postęp po wyświetleniu w przeglądarce.

Lista rozwijana Dostawców zawiera element Show ALL ListItem, plus jeden dla każdego dostawcy

Rysunek 5. Lista Suppliers rozwijana zawiera element Pokaż WSZYSTKIE ListItem, plus jeden dla każdego dostawcy (kliknij, aby wyświetlić obraz o pełnym rozmiarze)

Ponieważ chcemy zaktualizować interfejs użytkownika natychmiast po tym, jak użytkownik zmieni swój wybór, ustaw właściwość Suppliers DropDownList na AutoPostBacktrue. W kroku 2 utworzymy kontrolkę DetailsView, która będzie wyświetlać informacje dla dostawców na podstawie wybranego elementu DropDownList. Następnie, w kroku 3, utworzymy procedurę obsługi zdarzenia dla DropDownListSelectedIndexChanged, w której dodamy kod wiążący odpowiednie informacje o dostawcy z kontrolką DetailsView na podstawie wybranego dostawcy.

Krok 2. Dodawanie kontrolki DetailsView

Użyjmy kontrolki DetailsView, aby wyświetlić informacje o dostawcy. W przypadku użytkownika, który może wyświetlać i edytować wszystkich dostawców, kontrolka DetailsView będzie obsługiwać stronicowanie, umożliwiając użytkownikowi przechodzenie przez informacje o dostawcy po jednym rekordzie naraz. Jeśli jednak użytkownik pracuje dla określonego dostawcy, kontrolka DetailsView wyświetli tylko te informacje dostawcy i nie będzie zawierać interfejsu stronicowania. W obu przypadkach kontrolka DetailsView musi zezwolić użytkownikowi na edytowanie pól adresu dostawcy, miasta i kraju.

Dodaj element DetailsView do strony pod listą Suppliers DropDownList, ustaw jej ID właściwość na SupplierDetails, i powiąż ją z AllSuppliersDataSource obiektem ObjectDataSource utworzonym w poprzednim kroku. Następnie zaznacz pola wyboru Włącz stronicowanie i Włącz edytowanie z tagu inteligentnego DetailsView.

Uwaga / Notatka

Jeśli nie widzisz opcji Włącz edytowanie w tagu inteligentnym DetailsView, to dlatego, że nie zamapowałeś metody Update() klasy SuppliersBLL do metody UpdateSupplierAddress obiektu ObjectDataSource. Poświęć chwilę, aby wrócić i wprowadzić tę zmianę konfiguracji, po czym opcja Włącz edycję powinna pojawić się w inteligentnym tagu DetailsView.

SuppliersBLL Ponieważ metoda klasy s UpdateSupplierAddress akceptuje tylko cztery parametry — supplierID, address, city i country — zmodyfikuj pola BoundFields kontrolki DetailsView, tak aby pola CompanyName i Phone były tylko do odczytu. Ponadto całkowicie usuń pole SupplierID BoundField. Wreszcie, ObjectDataSource ma obecnie ustawioną właściwość AllSuppliersDataSource na OldValuesParameterFormatString. Poświęć chwilę, aby całkowicie usunąć to ustawienie właściwości ze składni deklaratywnej lub ustawić je na wartość domyślną {0}.

Po skonfigurowaniu kontrolki SupplierDetails DetailsView i AllSuppliersDataSource ObjectDataSource będziemy mieć następującą deklaratywną składnię:

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

W tym momencie można przechodzić między stronami w elemencie DetailsView, a informacje o adresie wybranego dostawcy można zaktualizować, niezależnie od wyboru w liście rozwijanej Suppliers (zobacz Rysunek 6).

Wszelkie informacje o dostawcach można wyświetlić i zaktualizować jego adres

Rysunek 6. Wszystkie informacje o dostawcach można wyświetlić i zaktualizować jego adres (kliknij, aby wyświetlić obraz pełnowymiarowy)

Krok 3. Wyświetlanie tylko informacji o wybranym dostawcy

Nasza strona zawiera obecnie informacje dla wszystkich dostawców, niezależnie od tego, czy określony dostawca został wybrany z listy rozwijanej Suppliers. Aby wyświetlić tylko informacje o dostawcy dla wybranego dostawcy, musimy dodać do naszej strony kolejny obiekt ObjectDataSource, który pobiera informacje o określonym dostawcy.

Dodaj nowy obiekt ObjectDataSource do strony, nazywając go SingleSupplierDataSource. W tagu inteligentnym kliknij link Konfiguruj źródło danych i użyj metody klasy SuppliersBLL s GetSupplierBySupplierID(supplierID). Podobnie jak w przypadku AllSuppliersDataSource ObjectDataSource, metoda SingleSupplierDataSource obiektu ObjectDataSource jest mapowana na metodę Update() klasy SuppliersBLL.

Konfigurowanie metody SingleSupplierDataSource ObjectDataSource przy użyciu metody GetSupplierBySupplierID(supplierID)

Rysunek 7. Konfigurowanie SingleSupplierDataSource obiektu ObjectDataSource do użycia GetSupplierBySupplierID(supplierID) metody (kliknij, aby wyświetlić obraz o pełnym rozmiarze)

Następnie zostanie wyświetlony monit o określenie źródła parametru dla parametru wejściowego GetSupplierBySupplierID(supplierID) metody supplierID . Ponieważ chcemy wyświetlić informacje dla dostawcy wybranego z DropDownList, użyj właściwości Suppliers DropDownList jako źródła SelectedValue parametrów.

Użyj listy rozwijanej 'Dostawcy' jako źródła parametru supplierID

Rysunek 8. Użyj listy rozwijanej Suppliers jako źródła parametrów supplierID (kliknij, aby wyświetlić obraz o pełnym rozmiarze)

Nawet w przypadku dodania tego drugiego obiektu ObjectDataSource kontrolka DetailsView jest obecnie skonfigurowana tak, aby zawsze korzystała AllSuppliersDataSource z obiektu ObjectDataSource. Musimy dodać logikę, aby dostosować źródło danych używane przez element DetailsView w zależności od wybranego Suppliers elementu DropDownList. W tym celu utwórz procedurę SelectedIndexChanged obsługi zdarzeń dla listy rozwijanej Dostawcy. To można najłatwiej utworzyć, klikając dwukrotnie DropDownList w Designerze. Ten program obsługi zdarzeń musi określić, które źródło danych ma być używane i musi ponownie połączyć dane z kontrolką DetailsView. Jest to realizowane przy użyciu następującego kodu:

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

Obsługa zdarzeń rozpoczyna się od określenia, czy została wybrana opcja "Pokaż/Edytuj WSZYSTKICH dostawców". Jeśli tak było, ustawia element SupplierDetails DetailsView na DataSourceIDAllSuppliersDataSource i zwraca użytkownika do pierwszego rekordu w zestawie dostawców, ustawiając właściwość PageIndex na 0. Jeśli jednak użytkownik wybrał określonego dostawcę z listy DropDownList, kontrolka DetailsView DataSourceID zostanie przypisana do elementu SingleSuppliersDataSource. Niezależnie od używanego źródła danych, tryb SuppliersDetails zostaje przywrócony do trybu tylko do odczytu, a dane są ponownie powiązane z DetailsView przez wywołanie metody kontrolki SuppliersDetailsDataBind().

Po wprowadzeniu tej obsługi zdarzeń kontrolka DetailsView wyświetla teraz wybranego dostawcę, chyba że została wybrana opcja "Pokaż/Edytuj wszystkich dostawców"; w tym przypadku wszyscy dostawcy mogą być wyświetlani za pośrednictwem interfejsu stronicowania. Rysunek 9 przedstawia stronę z wybraną opcją "Pokaż/Edytuj WSZYSTKICH dostawców"; Zwróć uwagę, że interfejs stronicowania jest obecny, co pozwala użytkownikowi odwiedzić i zaktualizować dowolnego dostawcę. Rysunek 10 przedstawia stronę z wybranym dostawcą Ma Maison. Tylko informacje Ma Maison są widoczne i edytowalne w tym przypadku.

Wszystkie informacje o dostawcach można wyświetlać i edytować

Rysunek 9. Wszystkie informacje o dostawcach można wyświetlić i edytować (kliknij, aby wyświetlić obraz pełnowymiarowy)

Tylko wybrane informacje o dostawcy mogą być wyświetlane i edytowane

Rysunek 10. Tylko wybrane informacje o dostawcy można wyświetlić i edytować (kliknij, aby wyświetlić obraz pełnowymiarowy)

Uwaga / Notatka

Na potrzeby tego samouczka zarówno kontrolki DropDownList EnableViewState, jak i DetailsView muszą być ustawione na true (wartość domyślna), ponieważ zmiany właściwości kontrolek DropDownList SelectedIndex i DetailsView DataSourceID muszą być zapamiętane w przypadku zwrotnego przesłania.

Krok 4: Wyświetlanie listy produktów dostawców w edytowalnym elemencie GridView

Po zakończeniu kontrolki DetailsView następnym krokiem jest dołączenie edytowalnego obiektu GridView zawierającego listę tych produktów dostarczonych przez wybranego dostawcę. Ten GridView powinien zezwalać na edycję tylko pól ProductName i QuantityPerUnit. Ponadto jeśli użytkownik odwiedzający stronę pochodzi z określonego dostawcy, powinien zezwalać na aktualizacje tylko tych produktów, które nie zostały przerwane. Aby to osiągnąć, należy najpierw dodać przeciążenie metody ProductsBLL klasy UpdateProducts, która przyjmuje jako dane wejściowe tylko pola ProductID, ProductName i QuantityPerUnit. Wcześniej omówiliśmy ten proces w wielu samouczkach, więc przyjrzyjmy się kodowi, który powinien zostać dodany do 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;
}

Po utworzeniu tego przeciążenia możemy dodać kontrolkę GridView i skojarzony z nią obiekt ObjectDataSource. Dodaj nowy obiekt GridView do strony, ustaw jej ID właściwość na ProductsBySupplier, a następnie skonfiguruj ją tak, aby korzystała z nowego obiektu ObjectDataSource o nazwie ProductsBySupplierDataSource. Ponieważ chcemy, aby ten element GridView wyświetlił listę tych produktów przez wybranego dostawcę, użyj ProductsBLL metody klasy s GetProductsBySupplierID(supplierID) . Przypisz również metodę Update() do nowo utworzonego przeciążenia UpdateProduct, które właśnie utworzyliśmy.

Konfigurowanie obiektu ObjectDataSource do używania właśnie utworzonego przeciążenia UpdateProduct

Rysunek 11. Konfigurowanie obiektu ObjectDataSource do używania właśnie utworzonego UpdateProduct przeciążenia (kliknij, aby wyświetlić obraz o pełnym rozmiarze)

Zostanie wyświetlony monit o wybranie źródła parametru dla parametru wejściowego GetProductsBySupplierID(supplierID) metody supplierID . Ponieważ chcemy wyświetlić produkty dla dostawcy wybranego w widoku DetailsView, użyj SuppliersDetails właściwości kontrolki SelectedValue DetailsView jako źródła parametrów.

Użyj właściwości SelectedValue elementu SuppliersDetails DetailsView jako źródła parametrów

Rysunek 12. Użyj SuppliersDetails właściwości DetailsView jako SelectedValue źródła parametrów (kliknij, aby wyświetlić obraz pełnowymiarowy)

Wracając do kontrolki GridView, usuń wszystkie pola GridView z wyjątkiem ProductName, QuantityPerUnit i Discontinued, a pole Discontinued CheckBoxField oznacz jako tylko do odczytu. Sprawdź również opcję Włącz edytowanie w GridView, korzystając z jego inteligentnego tagu. Po wprowadzeniu tych zmian znacznik deklaratywny dla elementów GridView i ObjectDataSource powinien wyglądać podobnie do następującego:

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

Podobnie jak w przypadku naszych poprzednich źródeł danych ObjectDataSource, właściwość ta jest ustawiona na OldValuesParameterFormatString, co spowoduje problemy podczas próby zaktualizowania nazwy lub ilości produktu na jednostkę. Usuń tę właściwość ze składni deklaratywnej całkowicie lub ustaw ją na wartość domyślną . {0}

Po zakończeniu konfiguracji nasza strona teraz przedstawia listę produktów oferowanych przez dostawcę wybranego w GridView (patrz Rysunek 13). Obecnie można zaktualizować dowolną nazwę lub ilość produktu na jednostkę. Musimy jednak zaktualizować logikę strony, tak aby taka funkcjonalność była zabroniona dla wycofanych produktów dla użytkowników skojarzonych z określonym dostawcą. Zajmiemy się tym ostatnim elementem w kroku 5.

Wyświetlane są produkty dostarczone przez wybranego dostawcę

Rysunek 13. Wyświetlane są produkty dostarczone przez wybranego dostawcę (kliknij, aby wyświetlić obraz pełnowymiarowy)

Uwaga / Notatka

Po dodaniu tej edytowalnej kontrolki GridView Suppliers program obsługi zdarzeń DropDownList SelectedIndexChanged powinien zostać zaktualizowany w celu zwrócenia kontrolki GridView do stanu tylko do odczytu. W przeciwnym razie, jeśli wybrany zostanie inny dostawca podczas edytowania informacji o produkcie, odpowiedni indeks w GridView dla nowego dostawcy będzie również możliwy do edytowania. Aby temu zapobiec, wystarczy ustawić właściwość EditIndex GridView na wartość -1 w procedurze zdarzeń SelectedIndexChanged.

Pamiętaj również, że ważne jest, aby stan widoku GridView był włączony (zachowanie domyślne). Jeśli ustawisz właściwość GridView EnableViewState na falsewartość , wystąpi ryzyko przypadkowego usunięcia lub edytowania rekordów przez współbieżnych użytkowników.

Krok 5. Nie zezwalaj na edytowanie wycofanych produktów, gdy nie wybrano opcji Pokaż/Edytuj wszystkich dostawców

Chociaż element ProductsBySupplier GridView jest w pełni funkcjonalny, obecnie zapewnia zbyt duży dostęp do tych użytkowników, którzy pochodzą z określonego dostawcy. Zgodnie z naszymi regułami biznesowymi tacy użytkownicy nie powinni mieć możliwości aktualizowania wycofanych produktów. Aby to wymusić, możemy ukryć (lub wyłączyć) przycisk Edytuj w tych wierszach kontrolki GridView z wycofanymi produktami, gdy strona jest odwiedzana przez użytkownika od dostawcy.

Utwórz procedurę obsługi zdarzeń dla zdarzenia GridView.RowDataBound W tym programie obsługi zdarzeń musimy określić, czy użytkownik jest skojarzony z określonym dostawcą, który na potrzeby tego samouczka można określić, sprawdzając właściwość Suppliers DropDownList s SelectedValue — jeśli jest to coś innego niż -1, użytkownik jest skojarzony z określonym dostawcą. W przypadku takich użytkowników musimy określić, czy produkt nie został wycofany. Możemy pobrać odwołanie do rzeczywistego ProductRow wystąpienia powiązanego z wierszem GridView poprzez właściwość e.Row.DataItem, jak wspomniano w samouczku Wyświetlanie informacji podsumowania w stopce kontrolki GridView. Jeśli produkt zostanie wycofany, możemy uzyskać programatyczne odwołanie do przycisku Edytuj w CommandField kontrolki GridView, korzystając z technik omówionych w poprzednim samouczku Dodawanie Client-Side potwierdzenia podczas usuwania. Po utworzeniu odwołania możemy ukryć lub wyłączyć przycisk.

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

Po wprowadzeniu tego programu obsługi zdarzeń, gdy użytkownik od określonego dostawcy odwiedza tę stronę, te produkty, które zostały wycofane z oferty, są nieedytowalne, ponieważ przycisk Edytuj jest ukryty dla tych produktów. Na przykład Chef Antona's Gumbo Mix to produkt, który został wycofany przez dostawcę New Orleans Cajun Delights. Podczas odwiedzania strony dla tego konkretnego dostawcy przycisk Edytuj dla tego produktu jest ukryty przed wzrokiem (patrz Rysunek 14). Jednak podczas wizyty przy użyciu przycisku "Pokaż/Edytuj wszystkich dostawców" dostępny jest przycisk Edytuj (zobacz Rysunek 15).

Dla użytkownika Supplier-Specific przycisk edycji dla mieszanki gumbo Chef Antona jest ukryty

Rysunek 14: w przypadku użytkowników Supplier-Specific przycisk edycji dla Gumbo Mix Chef Anton jest ukryty (kliknij, aby wyświetlić pełnowymiarowy obraz)

Dla wyświetlania/edytowania wszystkich użytkowników dostawców, jest wyświetlany przycisk Edytuj dla Chef Anton's Gumbo Mix

Rysunek 15. W przypadku wyświetlania/edytowania wszystkich użytkowników dostawców wyświetlany jest przycisk edycji dla programu Chef Anton s Gumbo Mix (kliknij, aby wyświetlić obraz pełnowymiarowy)

Sprawdzanie praw dostępu w warstwie logiki biznesowej

W tym samouczku strona ASP.NET zarządza całą logiką dotyczącą informacji, które użytkownik może zobaczyć i jakie produkty może zaktualizować. W idealnym przypadku ta logika będzie również obecna w warstwie logiki biznesowej. Na przykład SuppliersBLL metoda klasy s GetSuppliers() (która zwraca wszystkich dostawców) może zawierać sprawdzenie, czy aktualnie zalogowany użytkownik nie jest skojarzony z określonym dostawcą. Podobnie metoda może zawierać kontrolę, aby upewnić się, UpdateSupplierAddress że aktualnie zalogowany użytkownik pracował dla naszej firmy (i w związku z tym może zaktualizować wszystkie informacje o adresach dostawców) lub jest skojarzony z dostawcą, którego dane są aktualizowane.

Nie uwzględniłem w tym miejscu takich sprawdzeń warstwy BLL, ponieważ w naszym samouczku prawa użytkownika są ustalane za pomocą listy rozwijanej na stronie, do której klasy BLL nie mają dostępu. W przypadku korzystania z systemu członkostwa lub jednego z wbudowanych schematów uwierzytelniania oferowanych przez ASP.NET (takich jak uwierzytelnianie w systemie Windows), informacje o aktualnie zalogowanym użytkowniku oraz jego rolach można uzyskać za pośrednictwem BLL, co pozwala na sprawdzenie praw dostępu zarówno w warstwie prezentacji, jak i BLL.

Podsumowanie

Większość witryn, które udostępniają konta użytkowników, musi dostosować interfejs modyfikacji danych w oparciu o zalogowanego użytkownika. Użytkownicy administracyjni mogą być w stanie usunąć i edytować dowolny rekord, natomiast użytkownicy niebędący administratorami mogą być ograniczeni tylko do aktualizowania lub usuwania utworzonych przez siebie rekordów. Niezależnie od scenariusza, kontrolki danych sieci Web, ObjectDataSource i klasy warstwy logiki biznesowej można rozszerzyć, aby umożliwić lub odmówić dostęp do określonych funkcji w zależności od zalogowanego użytkownika. W tym samouczku pokazano, jak ograniczyć wyświetlanie i edytowalne dane w zależności od tego, czy użytkownik był skojarzony z konkretnym dostawcą, czy też pracował dla naszej firmy.

Ten samouczek kończy badanie wstawiania, aktualizowania i usuwania danych przy użyciu kontrolek GridView, DetailsView i FormView. Począwszy od następnego samouczka, zwrócimy uwagę na dodanie obsługi stronicowania i sortowania.

Szczęśliwe programowanie!

Informacje o autorze

Scott Mitchell, autor siedmiu książek ASP/ASP.NET i założyciel 4GuysFromRolla.com, współpracuje z technologiami internetowymi firmy Microsoft od 1998 roku. Scott pracuje jako niezależny konsultant, trener i pisarz. Jego najnowsza książka to Sams Teach Yourself ASP.NET 2.0 w ciągu 24 godzin. Można go uzyskać pod adresem mitchell@4GuysFromRolla.com.