Ograniczanie funkcji modyfikacji danych na podstawie użytkownika (VB)
W aplikacji internetowej, która umożliwia użytkownikom edytowanie danych, różne konta użytkowników mogą mieć różne uprawnienia do edytowania danych. W tym samouczku sprawdzimy, jak dynamicznie dostosować możliwości modyfikacji danych na podstawie odwiedzającego użytkownika.
Wprowadzenie
Wiele aplikacji internetowych obsługuje konta użytkowników i udostępnia różne opcje, raporty i funkcje oparte na zalogowanym użytkowniku. Na przykład w naszych samouczkach możemy zezwolić użytkownikom od firm dostawcy na zalogowanie się do witryny i zaktualizować ogólne informacje o swoich produktach — ich nazwa i ilość na jednostkę, być może — wraz z informacjami o dostawcy, takimi jak ich nazwa firmy, adres, informacje osoby kontaktowej itd. Ponadto możemy chcieć uwzględnić niektóre konta użytkowników dla osób z naszej firmy, aby mogli logować się i aktualizować informacje o produkcie, takie jak jednostki zapasów, poziom zmiany kolejności itd. Nasza aplikacja internetowa może również zezwalać anonimowym użytkownikom na odwiedzanie (osoby, 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 sieci Web danych na naszych stronach ASP.NET oferowały wstawianie, edytowanie i usuwanie funkcji odpowiednich dla aktualnie zalogowanego użytkownika.
W tym samouczku sprawdzimy, jak dynamicznie dostosować możliwości modyfikacji danych na podstawie odwiedzającego użytkownika. W szczególności utworzymy stronę, która wyświetla informacje o dostawcach 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; i zmodyfikuj informacje dotyczące dowolnego produktu dostarczonego przez dostawcę. Jeśli jednak użytkownik pochodzi z określonej firmy, może wyświetlać i edytować własne informacje o adresach i edytować tylko swoje produkty, które nie zostały oznaczone jako przerwane.
Rysunek 1. Użytkownik naszej firmy może edytować informacje o dostawcy (kliknij, aby wyświetlić obraz pełnowymiarowy)
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
system członkostwa ASP.NET 2.0 zapewnia ustandaryzowaną, rozszerzalną platformę do tworzenia kont użytkowników, zarządzania nimi i sprawdzania ich poprawności. Ponieważ badanie systemu członkostwa wykracza poza zakres tych samouczków, ten samouczek zamiast "fałszywych" członkostwa pozwala anonimowym odwiedzającym wybrać, czy pochodzą z określonego dostawcy, czy od naszej firmy. Aby uzyskać więcej informacji na temat członkostwa, zapoznaj się z artykułem Badanie członkostwa ASP.NET 2.0 s, ról i profilu .
Krok 1. Zezwolenie użytkownikowi na określanie praw dostępu
W rzeczywistej aplikacji internetowej informacje o koncie użytkownika obejmują, czy pracowali dla naszej firmy, czy dla konkretnego dostawcy, a te informacje będą programowo dostępne z naszych stron ASP.NET po zalogowaniu się użytkownika do witryny. Te informacje mogą być przechwytywane za pośrednictwem systemu 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 środków niestandardowych.
Ponieważ celem tego samouczka jest zademonstrowanie dostosowania możliwości modyfikacji danych na podstawie zalogowanego użytkownika i nie ma na celu zaprezentowania członkostwa ASP.NET 2.0 s członkostwa, ról i systemów profilów, użyjemy bardzo prostego mechanizmu w celu określenia możliwości użytkownika odwiedzającego stronę — listy rozwijanej, z której użytkownik może wskazać, czy powinien być w stanie wyświetlić i edytować dowolne informacje dostawcy 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 ona stronicować za pośrednictwem wszystkich dostawców, 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 wyświetlać i edytować tylko określonego dostawcę, może wyświetlić tylko szczegóły i produkty dla tego dostawcy i może zaktualizować tylko nazwę i ilość na informacje o jednostce dla tych produktów, które nie zostały przerwane.
Pierwszym krokiem w tym samouczku jest utworzenie tej listy rozwijanej i wypełnienie jej dostawcami w systemie. UserLevelAccess.aspx
Otwórz stronę w folderzeEditInsertDelete
, dodaj listę rozwijaną, której ID
właściwość jest ustawiona na Suppliers
, i powiąż tę listę rozwijaną z nową wartością ObjectDataSource o nazwie AllSuppliersDataSource
.
Rysunek 3. Utwórz nową nazwę ObjectDataSource 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 jest Update()
mapowana na SuppliersBLL
metodę klasy UpdateSupplierAddress
, ponieważ to źródło ObjectDataSource będzie również używane przez element DetailsView, który dodamy w kroku 2.
Po ukończeniu pracy kreatora ObjectDataSource wykonaj kroki, konfigurując Suppliers
listę Rozwijaną, tak aby wyświetlała CompanyName
pole danych i używa SupplierID
pola danych jako wartości dla każdego ListItem
elementu .
Rysunek 4. Konfigurowanie listy rozwijanej Suppliers
do użycia CompanyName
pól danych i SupplierID
(kliknij, aby wyświetlić obraz pełnowymiarowy)
W tym momencie lista rozwijana zawiera listę nazw firm dostawców w bazie danych. Jednak musimy również dołączyć opcję "Pokaż/Edytuj wszystkich dostawców" do listy rozwijanej. Aby to osiągnąć, ustaw Suppliers
właściwość DropDownList na AppendDataBoundItems
true
, a następnie dodaj ListItem
właściwość, Text
której właściwość to "Pokaż/Edytuj wszystkich dostawców" i której wartością jest -1
. Można to dodać bezpośrednio za pomocą znaczników deklaratywnego lub za pośrednictwem Projektant, przechodząc do okno Właściwości i klikając wielokropek we właściwości DropDownListItems
.
Uwaga
Zapoznaj się z samouczkiem Master/Detail Filtering With a DropDownList (Filtrowanie wzorca/szczegółów z listą rozwijaną Lista rozwijana) w celu bardziej szczegółowego omówienia dodawania elementu Select All do listy rozwijanej dla danych.
Po ustawieniu AppendDataBoundItems
właściwości i ListItem
dodaniu znaczniki deklaratywne Listy rozwijanej powinny 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 nasz bieżący postęp po wyświetleniu w przeglądarce.
Rysunek 5. Lista Suppliers
rozwijana zawiera element Pokaż WSZYSTKO ListItem
, plus jeden dla każdego dostawcy (kliknij, aby wyświetlić obraz pełnowymiarowy)
Ponieważ chcemy zaktualizować interfejs użytkownika natychmiast po zmianie wyboru użytkownika, ustaw Suppliers
właściwość DropDownList AutoPostBack
na true
. W kroku 2 utworzymy kontrolkę DetailsView, która będzie wyświetlać informacje dotyczące dostawców na podstawie zaznaczenia Listy rozwijanej. Następnie w kroku 3 utworzymy procedurę obsługi zdarzeń dla tego zdarzenia DropDownList SelectedIndexChanged
, w którym dodamy kod, który wiąże odpowiednie informacje o dostawcy z elementem DetailsView na podstawie wybranego dostawcy.
Krok 2. Dodawanie kontrolki DetailsView
Użyjmy elementu DetailsView, aby wyświetlić informacje o dostawcy. W przypadku użytkownika, który może wyświetlać i edytować wszystkich dostawców, funkcja DetailsView będzie obsługiwać stronicowanie, umożliwiając użytkownikowi przechodzenie przez informacje o dostawcy jeden rekord naraz. Jeśli jednak użytkownik pracuje dla określonego dostawcy, element DetailsView pokaże tylko te informacje dostawcy i nie będzie zawierać interfejsu stronicowania. W obu przypadkach element DetailsView musi zezwolić użytkownikowi na edytowanie adresów dostawcy, miast i pól kraju.
Dodaj element DetailsView do strony pod Suppliers
listą 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
Jeśli nie widzisz opcji Włącz edytowanie w tagu inteligentnym Elementu DetailsView, ponieważ nie zamapujesz metody ObjectDataSource na Update()
metodę SuppliersBLL
klasy s UpdateSupplierAddress
. Poświęć chwilę, aby wrócić i wprowadzić tę zmianę konfiguracji, po której opcja Włącz edycję powinna pojawić się w tagu inteligentnym DetailsView.
SuppliersBLL
Ponieważ metoda klasy UpdateSupplierAddress
akceptuje tylko cztery parametry — supplierID
, address
, city
i country
— zmodyfikuj pola BoundFields elementu DetailsView, tak aby CompanyName
pola i są Phone
tylko do odczytu. Ponadto całkowicie usuń pole SupplierID
BoundField. Na koniec obiekt AllSuppliersDataSource
ObjectDataSource ma obecnie właściwość OldValuesParameterFormatString
ustawioną na original_{0}
. Poświęć chwilę, aby całkowicie usunąć to ustawienie właściwości ze składni deklaratywnej lub ustawić je na wartość {0}
domyślną .
Po skonfigurowaniu elementu SupplierDetails
DetailsView i AllSuppliersDataSource
ObjectDataSource będziemy mieć następujące znaczniki deklaratywne:
<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 element DetailsView można stronicować, a wybrane informacje o adresie dostawcy można zaktualizować niezależnie od wyboru dokonanego w liście rozwijanej Suppliers
(zobacz Rysunek 6).
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 wybranych informacji o dostawcy
Na naszej stronie są obecnie wyświetlane informacje dotyczące wszystkich dostawców niezależnie od tego, czy określony dostawca został wybrany z listy Suppliers
Rozwijanej. Aby wyświetlić tylko informacje o dostawcy dla wybranego dostawcy, musimy dodać kolejne źródło ObjectDataSource do naszej strony, które pobiera informacje o określonym dostawcy.
Dodaj nowy obiekt ObjectDataSource do strony, nazewając go SingleSupplierDataSource
. W tagu inteligentnym kliknij link Konfiguruj źródło danych i użyj SuppliersBLL
metody s GetSupplierBySupplierID(supplierID)
klasy. Podobnie jak w przypadku AllSuppliersDataSource
obiektu ObjectDataSource, należy SingleSupplierDataSource
zamapować metodę ObjectDataSource Update()
na metodę SuppliersBLL
s UpdateSupplierAddress
klasy.
Rysunek 7. Konfigurowanie obiektu SingleSupplierDataSource
ObjectDataSource do użycia GetSupplierBySupplierID(supplierID)
metody (kliknij, aby wyświetlić obraz pełnowymiarowy)
Następnie zostanie wyświetlony monit o określenie źródła parametrów dla parametru wejściowego GetSupplierBySupplierID(supplierID)
metody supplierID
. Ponieważ chcemy wyświetlić informacje dla dostawcy wybranego z listy DropDownList, użyj Suppliers
właściwości DropDownList SelectedValue
jako źródła parametrów.
Rysunek 8. Użyj listy rozwijanej jako źródła parametrów Suppliers
supplierID
(kliknij, aby wyświetlić obraz pełnowymiarowy)
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. Aby to osiągnąć, utwórz procedurę SelectedIndexChanged
obsługi zdarzeń dla listy rozwijanej Dostawcy. Można to łatwo utworzyć, klikając dwukrotnie listę Rozwijaną w Projektant. Ta procedura 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 za pomocą następującego kodu:
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
Procedura obsługi zdarzeń rozpoczyna się od określenia, czy wybrano opcję "Pokaż/Edytuj wszystkich dostawców". Jeśli tak było, ustawia element SupplierDetails
DetailsView s DataSourceID
na AllSuppliersDataSource
i zwraca użytkownikowi pierwszy rekord w zestawie dostawców, ustawiając PageIndex
właściwość na 0. Jeśli jednak użytkownik wybrał określonego dostawcę z Listy rozwijanej, element DetailsView jest DataSourceID
przypisany do SingleSuppliersDataSource
elementu . Niezależnie od tego, jakie źródło danych jest używane, SuppliersDetails
tryb jest przywracany do trybu tylko do odczytu, a dane są przywracane do widoku DetailsView przez wywołanie metody s kontrolki SuppliersDetails
DataBind()
.
Po wprowadzeniu tej procedury obsługi zdarzeń kontrolka DetailsView wyświetla teraz wybranego dostawcę, chyba że wybrano opcję "Pokaż/Edytuj wszystkich dostawców", w takim przypadku wszyscy dostawcy mogą być wyświetlani za pośrednictwem interfejsu stronicowania. Rysunek 9 przedstawia stronę z wybraną opcją "Pokaż/Edytuj wszystkich dostawców"; Należy pamiętać, że interfejs stronicowania jest obecny, umożliwiając użytkownikowi odwiedzanie i aktualizowanie dowolnego dostawcy. Rysunek 10 przedstawia stronę z wybranym dostawcą Ma Maison. Tylko informacje Ma Maison są widoczne i edytowalne w tym przypadku.
Rysunek 9. Wszystkie informacje o dostawcach można wyświetlić i edytować (kliknij, aby wyświetlić obraz pełnowymiarowy)
Rysunek 10. Tylko wybrane informacje o dostawcy można wyświetlić i edytować (kliknij, aby wyświetlić obraz pełnowymiarowy)
Uwaga
W tym samouczku zarówno kontrolki EnableViewState
DropDownList, jak i DetailsView muszą być ustawione na true
wartość (wartość domyślna), ponieważ zmiany właściwości Kontrolki DropDownList SelectedIndex
i DetailsView DataSourceID
muszą być zapamiętwane między ogłaszaniami zwrotnymi.
Krok 4. Wyświetlanie listy produktów dostawców w edytowalnej siatce GridView
Po zakończeniu widoku DetailsView następnym krokiem jest dołączenie edytowalnego obiektu GridView zawierającego listę tych produktów dostarczonych przez wybranego dostawcę. Ten element GridView powinien zezwalać na edycje tylko do ProductName
pól 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 wycofane. Aby to osiągnąć, musimy najpierw dodać przeciążenie ProductsBLL
metody klasy UpdateProducts
, która przyjmuje tylko ProductID
pola , ProductName
i QuantityPerUnit
jako dane wejściowe. Omówiliśmy ten proces wcześniej w wielu samouczkach, więc przyjrzyjmy się kodowi tutaj, który powinien zostać dodany do ProductsBLL
polecenia :
<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
Po utworzeniu tego przeciążenia możemy dodać kontrolkę GridView i skojarzona z nią kontrolkę 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 obiekt GridView wyświetlił listę tych produktów przez wybranego dostawcę, użyj ProductsBLL
metody klasy s GetProductsBySupplierID(supplierID)
. Zamapuj również metodę Update()
na nowo UpdateProduct
utworzone przeciążenie.
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.
Rysunek 12. Użyj SuppliersDetails
właściwości Kontrolka SelectedValue
DetailsView jako ź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
pól , QuantityPerUnit
i Discontinued
, oznaczając pole Discontinued
CheckBoxField jako tylko do odczytu. Sprawdź również opcję Włącz edycję z tagu inteligentnego GridView. Po wprowadzeniu tych zmian znaczniki deklaratywne dla elementów GridView i ObjectDataSource powinny wyglądać podobnie do następujących:
<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 poprzednich obiektów ObjectDataSources, ta właściwość jest OldValuesParameterFormatString
ustawiona na original_{0}
wartość , co spowoduje problemy podczas próby zaktualizowania nazwy produktu lub ilości na jednostkę. Usuń tę właściwość z składni deklaratywnej lub ustaw ją na wartość domyślną . {0}
Po zakończeniu tej konfiguracji nasza strona zawiera teraz listę produktów dostarczonych przez dostawcę wybranego w elementy GridView (zobacz Rysunek 13). Obecnie można zaktualizować dowolną nazwę lub ilość produktu na jednostkę. Musimy jednak zaktualizować logikę strony, aby takie funkcje nie mogły być obsługiwane w przypadku wycofanych produktów dla użytkowników skojarzonych z określonym dostawcą. Zajmiemy się tym ostatnim elementem w kroku 5.
Rysunek 13. Wyświetlane są produkty dostarczone przez wybranego dostawcę (kliknij, aby wyświetlić obraz pełnowymiarowy)
Uwaga
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 w trakcie edytowania informacji o produkcie wybrano innego dostawcę, odpowiedni indeks w siatce dla nowego dostawcy będzie również możliwy do edycji. Aby temu zapobiec, wystarczy ustawić właściwość GridView EditIndex
na -1
wartość w procedurze obsługi zdarzeń SelectedIndexChanged
.
Należy również pamiętać, że należy włączyć stan widoku GridView (zachowanie domyślne). Jeśli ustawisz właściwość GridView EnableViewState
na false
wartość , ryzykujesz, że równoczesni użytkownicy przypadkowo usuwają lub edytują rekordy.
Krok 5. Nie zezwalaj na edytowanie wycofanych produktów po wybraniu 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 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 został wycofany. Możemy pobrać odwołanie do rzeczywistego ProductRow
wystąpienia powiązanego z wierszem GridView za pośrednictwem e.Row.DataItem
właściwości, zgodnie z opisem w samouczku Wyświetlanie informacji o podsumowaniu w stopce kontrolki GridView . Jeśli produkt nie zostanie wycofany, możemy pobrać odwołanie programowe do przycisku Edytuj w pole polecenia kontrolki GridView przy użyciu technik omówionych w poprzednim samouczku: Dodawanie potwierdzenia Client-Side podczas usuwania. Po utworzeniu odwołania możemy ukryć lub wyłączyć przycisk.
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
Po wprowadzeniu tej procedury obsługi zdarzeń podczas odwiedzania tej strony jako użytkownik od określonego dostawcy te produkty, które zostały wycofane, nie można edytować, ponieważ przycisk Edytuj jest ukryty dla tych produktów. Na przykład Chef Anton s Gumbo Mix jest zaprzestanym produktem dla dostawcy New Orleans Cajun Delights. Podczas odwiedzania strony dla tego konkretnego dostawcy przycisk Edytuj dla tego produktu jest ukryty przed wzrokiem (zobacz Rysunek 14). Jednak podczas wizyty przy użyciu przycisku "Pokaż/Edytuj wszystkich dostawców" dostępny jest przycisk Edytuj (zobacz Rysunek 15).
Rysunek 14. W przypadku użytkowników Supplier-Specific przycisk edycji dla programu Chef Anton s Gumbo Mix jest ukryty (kliknij, aby wyświetlić obraz w pełnym rozmiarze)
Rysunek 15. W przypadku wyświetlania/edytowania wszystkich użytkowników dostawców zostanie wyświetlony przycisk Edytuj 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 obsługuje całą logikę w odniesieniu do 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ć kontrolę, aby upewnić się, że aktualnie zalogowany użytkownik nie jest skojarzony z określonym dostawcą. Podobnie metoda może obejmować sprawdzenie, UpdateSupplierAddress
czy aktualnie zalogowany użytkownik pracował dla naszej firmy (i w związku z tym może zaktualizować informacje o adresie wszystkich dostawców) lub jest skojarzony z dostawcą, którego dane są aktualizowane.
Nie obejmowałem takich kontroli warstwy BLL tutaj, ponieważ w naszym samouczku prawa użytkownika są określane przez DropDownList na stronie, do której klasy BLL nie mogą uzyskać dostępu. W przypadku korzystania z systemu członkostwa lub jednego z wbudowanych schematów uwierzytelniania dostarczonych przez ASP.NET (takich jak uwierzytelnianie systemu Windows), obecnie zalogowane informacje o użytkowniku i informacje o rolach mogą być dostępne z poziomu BLL, dzięki czemu takie kontrole praw dostępu są możliwe zarówno w warstwach prezentacji, jak i BLL.
Podsumowanie
Większość witryn, które udostępniają konta użytkowników, musi dostosować interfejs modyfikacji danych na podstawie 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, można rozszerzyć klasy kontrolki sieci Web danych, ObjectDataSource i Business Logic Layer, aby dodać lub odrzucić niektóre funkcje na podstawie 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 określonym 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 do niego dotrzeć pod adresem mitchell@4GuysFromRolla.com. Lub za pośrednictwem swojego bloga, który można znaleźć na stronie http://ScottOnWriting.NET.