Поделиться через


Ограничение функций изменения данных в зависимости от пользователя (VB)

Скотт Митчелл

Скачивание PDF

В веб-приложении, позволяющем пользователям изменять данные, разные учетные записи пользователей могут иметь разные права редактирования данных. В этом руководстве мы рассмотрим, как динамически настраивать возможности изменения данных на основе посещаемого пользователя.

Введение

Ряд веб-приложений поддерживают учетные записи пользователей и предоставляют различные параметры, отчеты и функциональные возможности на основе пользователя, вошедшего в систему. Например, в наших руководствах мы можем позволить пользователям от поставщиков войти на сайт и обновить общие сведения о своих продуктах - их имя и количество на единицу, возможно, наряду с информацией о поставщике, например их название компании, адрес, сведения контактного лица и т. д. Кроме того, мы можем включить некоторые учетные записи пользователей из нашей компании, чтобы они могли войти в систему и обновить сведения о продукте, такие как единицы на складе, уровень повторного заказа и т. д. Наше веб-приложение также может позволить анонимным пользователям посетить (пользователи, которые не вошли в систему), но ограничить их только просмотром данных. С такой системой учетной записи пользователя мы хотели бы, чтобы веб-элементы управления данными на страницах ASP.NET предложили возможности вставки, редактирования и удаления, подходящие для текущего вошедшего в систему пользователя.

В этом руководстве мы рассмотрим, как динамически настраивать возможности изменения данных на основе посещаемого пользователя. В частности, мы создадим страницу, которая отображает сведения о поставщиках в редактируемом DetailsView вместе с GridView, в котором перечислены продукты, предоставляемые поставщиком. Если пользователь, посещающий страницу, является сотрудником нашей компании, он может: просмотреть любую информацию о поставщике; изменить его адрес; и изменить информацию о любом продукте, предоставленном поставщиком. Однако если пользователь принадлежит определенной компании, он может просматривать и изменять только свои собственные сведения об адресе и изменять только свои продукты, которые не были помечены как прекращенные.

Пользователь из нашей компании может изменять любые сведения о поставщике

Рис. 1. Пользователь из нашей компании может изменить любую информацию поставщика (щелкните, чтобы просмотреть изображение полного размера)

Пользователь из конкретного поставщика может просматривать и изменять свои сведения только

Рис. 2. Пользователь из конкретного поставщика может просматривать и изменять свои сведения (щелкните, чтобы просмотреть изображение полного размера)

Давайте приступим!

Замечание

ASP.NET 2.0 система членства предоставляет стандартизованную расширяемую платформу для создания, управления и проверки учетных записей пользователей. Поскольку изучение системы членства не входит в рамки этих учебников, это руководство вместо этого "симулирует" членство, позволяя анонимным посетителям выбирать, являются ли они представителями определенного поставщика или нашей компании. Дополнительные сведения о членстве см. в серии статей о членстве , ролях и профилях ASP.NET 2.0 .

Шаг 1. Разрешение пользователю указать свои права доступа

В реальном веб-приложении сведения об учетной записи пользователя будут включать, работали ли они в нашей компании или для конкретного поставщика, и эта информация будет программно доступна на страницах ASP.NET после входа пользователя на сайт. Эту информацию можно получить с помощью системы ролей ASP.NET 2.0, как информацию об учетной записи на уровне пользователя через систему профилей или с помощью некоторых пользовательских способов.

Так как цель этого руководства заключается в том, чтобы продемонстрировать возможности изменения данных на основе зарегистрированного пользователя, и не предназначено для демонстрации ASP.NET 2.0, членства, ролей и профилей, мы будем использовать очень простой механизм для определения возможностей пользователя, посещающего страницу, — выпадающий список (DropDownList), из которого пользователь может указать, может ли он просматривать и изменять всю информацию о поставщиках или, кроме того, какие сведения о конкретном поставщике он может просматривать и изменять. Если пользователь указывает, что она может просматривать и изменять все сведения о поставщике (по умолчанию), она может просматривать все поставщики, изменять сведения об адресе поставщика и изменять имя и количество для любого продукта, предоставленного выбранным поставщиком. Если пользователь указывает, что она может просматривать и изменять только одного поставщика, то она может просматривать только сведения и товары для этого поставщика и может обновлять только имя и количество информации для тех товаров, которые не снятые с производства.

Первым шагом в этом руководстве будет создание выпадающего списка и заполнение его поставщиками из текущей системы. Откройте страницу UserLevelAccess.aspx в папке EditInsertDelete, добавьте элемент DropDownList, свойство которого ID установлено на Suppliers, и привяжите этот DropDownList к новому источнику данных ObjectDataSource с именем AllSuppliersDataSource.

Создание объекта ObjectDataSource с именем AllSuppliersDataSource

Рис. 3. Создание объекта ObjectDataSource С именем AllSuppliersDataSource (щелкните, чтобы просмотреть изображение полного размера)

Поскольку мы хотим, чтобы этот DropDownList включал всех поставщиков, настройте ObjectDataSource для вызова метода класса SuppliersBLLGetSuppliers(). Кроме того, убедитесь, что метод Update() ObjectDataSource сопоставляется с методом SuppliersBLL класса UpdateSupplierAddress, так как этот ObjectDataSource также будет использоваться в DetailsView, который мы добавим на втором шаге.

После завершения мастера ObjectDataSource выполните действия, настроив Suppliers выпадающий список так, чтобы он отображал CompanyName поле данных и использовал SupplierID поле данных в качестве значения для каждого ListItem.

Настройка раскрывающегося списка поставщиков для использования полей данных CompanyName и SupplierID

Рис. 4. Настройка Suppliers раскрывающегося списка для использования CompanyName полей данных и SupplierID полей данных (щелкните, чтобы просмотреть изображение полного размера)

На этом этапе в раскрывающемся списке перечислены названия компаний-поставщиков в этой базе данных. Однако также необходимо включить параметр Show/Edit ALL Providers (Показать и изменить всех поставщиков) в dropDownList. Для этого установите свойство Suppliers DropDownList AppendDataBoundItems на true, а затем добавьте ListItem, у которого свойство Text равно "Show/Edit ALL Suppliers" и значение -1. Это можно добавить непосредственно через декларативную разметку или через конструктор, перейдя в окно свойств и щелкнув многоточие в свойстве DropDownList Items .

Замечание

Обратитесь к руководству по фильтрации с помощью раскрывающегося списка Master/Detail для более подробного обсуждения добавления элемента Select All в привязанный к данным DropDownList.

После того, как свойство AppendDataBoundItems было установлено и ListItem добавлено, декларативная разметка DropDownList должна выглядеть следующим образом:

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

На рисунке 5 показан снимок экрана текущего хода выполнения при просмотре через браузер.

Раскрывающийся список поставщиков содержит элемент списка

Рис. 5. Раскрывающийся список Suppliers содержит "Показать ВСЕ" ListItem, плюс один для каждого поставщика (щелкните, чтобы просмотреть изображение в полном размере)

Так как мы хотим обновить пользовательский интерфейс сразу после того, как пользователь изменил свой выбор, задайте Suppliers для свойства DropDownList AutoPostBack значение true. На шаге 2 мы создадим элемент управления DetailsView, который будет отображать сведения для поставщиков на основе выбора DropDownList. Затем на шаге 3 мы создадим обработчик событий для этого события DropDownList SelectedIndexChanged , в котором мы добавим код, который привязывает соответствующие сведения поставщика к DetailsView на основе выбранного поставщика.

Шаг 2. Добавление элемента управления DetailsView

Давайте будем использовать DetailsView для отображения сведений о поставщике. Для пользователя, который может просматривать и изменять всех поставщиков, представление DetailsView будет поддерживать разбиение на страницы, что позволит пользователю просматривать информацию о поставщике по одной записи за раз. Если пользователь работает для определенного поставщика, то в DetailsView будут отображаться только сведения об этом поставщике, однако интерфейс разбиения по страницам не будет включен. В любом случае элемент управления DetailsView должен позволять пользователю изменять поля адреса поставщика, города и страны.

Добавьте DetailsView на страницу под Suppliers DropDownList, задайте для свойства значение IDSupplierDetailsи привязите его к AllSuppliersDataSource ObjectDataSource, созданному на предыдущем шаге. Затем установите флажки "Включить разбиение по страницам" и "Включить редактирование" в смарт-теге DetailsView.

Замечание

Если параметр "Включить редактирование" в смарт-теге DetailsView не отображается, это потому что вы не сопоставили метод Update() элемента ObjectDataSource с методом SuppliersBLL класса UpdateSupplierAddress. Вернитесь и измените эту конфигурацию, после чего параметр "Включить редактирование" должен отображаться в смарт-теге DetailsView.

SuppliersBLL Так как метод класса UpdateSupplierAddress принимает всего четыре параметра — supplierID, address, city и country — измените поля BoundFields DetailsView, чтобы CompanyName и Phone BoundFields были доступны только для чтения. Кроме того, удалите SupplierID BoundField полностью. Наконец, у AllSuppliersDataSource ObjectDataSource в настоящее время свойство OldValuesParameterFormatString установлено в original_{0}. Чтобы полностью удалить этот параметр свойства из декларативного синтаксиса или установить его значение по умолчанию {0}, выполните следующие действия.

После настройки DetailsView и SupplierDetails ObjectDataSource у нас будет следующая декларативная AllSuppliersDataSource разметка:

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

На этом этапе представление DetailsView можно просмотреть, а сведения об адресе выбранного поставщика можно обновить независимо от выбранного выбора в Suppliers DropDownList (см. рис. 6).

Любые сведения о поставщиках можно просмотреть, а его адрес обновлен

Рис. 6. Любые сведения о поставщиках можно просмотреть и обновить его адрес (щелкните, чтобы просмотреть изображение полного размера)

Шаг 3. Отображение только сведений о выбранном поставщике

На нашей странице в настоящее время отображаются сведения для всех поставщиков независимо от того, выбран ли конкретный поставщик из Suppliers DropDownList. Чтобы отобразить только сведения о выбранном поставщике, необходимо добавить на нашу страницу другой ObjectDataSource, который извлекает информацию о конкретном поставщике.

Добавьте новый ObjectDataSource на страницу, именуя его SingleSupplierDataSource. В смарт-теге щелкните ссылку "Настроить источник данных" и используйте SuppliersBLL метод класса GetSupplierBySupplierID(supplierID) . Как и в случае с AllSuppliersDataSource ObjectDataSource, метод SingleSupplierDataSource ObjectDataSource Update() должен быть сопоставлен с методом класса SuppliersBLLUpdateSupplierAddress.

Настройка объекта ObjectDataSource SingleSupplierDataSource для использования метода GetSupplierBySupplierID(supplierID)

Рис. 7. Настройка SingleSupplierDataSource ObjectDataSource для использования GetSupplierBySupplierID(supplierID) метода (щелкните, чтобы просмотреть изображение полного размера)

Затем нам будет предложено указать источник параметров для GetSupplierBySupplierID(supplierID) входного параметра метода supplierID . Поскольку мы хотим показать информацию о поставщике, выбранном из DropDownList, используйте свойство DropDownList как источник параметров.

Используйте DropDownList поставщиков в качестве источника параметра supplierID

Рис. 8. Использование Suppliers DropDownList в качестве supplierID источника параметров (щелкните, чтобы просмотреть изображение полного размера)

Даже с добавлением второго объекта ObjectDataSource элемент управления DetailsView всегда настраивается для использования AllSuppliersDataSource ObjectDataSource. Нам нужно добавить логику для настройки источника данных, используемого в DetailsView в зависимости от выбранного Suppliers элемента DropDownList. Для этого создайте обработчик событий для списка выбора поставщиков. Это проще всего сделать, дважды щелкнув раскрывающийся список в визуальном конструкторе. Этот обработчик событий должен определить, какой источник данных следует использовать и должен повторно привязать данные к DetailsView. Это выполняется с помощью следующего кода:

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

Обработчик событий начинается с определения того, был ли выбран параметр Show/Edit ALL Providers. Если это так, он задает SupplierDetails значение DetailsView и DataSourceIDAllSuppliersDataSource возвращает пользователю первую запись в наборе поставщиков, задав свойству PageIndex значение 0. Если, однако, пользователь выбрал конкретного поставщика из DropDownList, DetailsView присваивается DataSourceID на SingleSuppliersDataSource. Независимо от того, какой источник данных используется, режим SuppliersDetails возвращается в режим только для чтения, а данные снова связываются с DetailsView путем вызова метода SuppliersDetails элемента управления DataBind() .

С помощью этого обработчика событий элемент управления DetailsView теперь отображает выбранного поставщика, если только не выбран параметр Show/Edit ALL Providers(Показать или изменить все поставщики), в этом случае все поставщики могут просматриваться через интерфейс разбиения по страницам. На рисунке 9 показана страница с выбранным параметром "Показать и изменить все поставщики"; обратите внимание, что интерфейс разбиения по страницам присутствует, позволяя пользователю посещать и обновлять любого поставщика. На рисунке 10 показана страница с выбранным поставщиком Ma Maison. Только сведения Ma Maison доступны для просмотра и редактирования в этом случае.

Все сведения о поставщиках можно просматривать и изменять

Рис. 9. Все сведения о поставщиках можно просмотреть и изменить (щелкните, чтобы просмотреть изображение полного размера)

Просмотреть и изменить только сведения о выбранном поставщике

Рис. 10. Только выбранные сведения о поставщике можно просмотреть и изменить (щелкните, чтобы просмотреть изображение полного размера)

Замечание

В этом руководстве элемент управления DropDownList EnableViewState и DetailsView true должен иметь значение (по умолчанию), поскольку изменения свойства DropDownList SelectedIndex и свойства DetailsView DataSourceID должны сохраняться в ходе постбэков.

Шаг 4. Перечисление продуктов поставщиков в редактируемом GridView

После завершения DetailsView необходимо включить редактируемый GridView, который перечисляет эти продукты, предоставляемые выбранным поставщиком. Этот GridView должен разрешать изменения только для ProductName полей и QuantityPerUnit полей. Кроме того, если пользователь, посещающий страницу, представляет определенного поставщика, следует разрешать обновление только тех продуктов, которые не сняты с производства. Для этого сначала необходимо добавить перегрузку метода класса ProductsBLL, который принимает только поля UpdateProducts, ProductID и ProductName в качестве входных данных. Мы шагнули через этот процесс заранее в многочисленных руководствах, поэтому давайте просто рассмотрим код здесь, который следует добавить в 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

Создав эту перегрузку, мы готовы добавить управляющий элемент GridView и связанный с ним объект ObjectDataSource. Добавьте новый GridView на страницу, задайте для него значение свойства IDProductsBySupplierи настройте его для использования нового объекта ObjectDataSource с именем ProductsBySupplierDataSource. Так как мы хотим, чтобы этот GridView перечислил продукты, относящиеся к выбранному поставщику, используйте метод класса ProductsBLLGetProductsBySupplierID(supplierID). Кроме того, метод Update() должен быть сопоставлен с новой перегрузкой UpdateProduct, которую мы только что создали.

Настройка ObjectDataSource для использования только что созданной перегрузки UpdateProduct

Рис. 11. Сконфигурируйте ObjectDataSource для использования только что созданной перегрузки UpdateProduct (щелкните, чтобы просмотреть изображение полного размера)

Нам будет предложено выбрать источник параметров для GetProductsBySupplierID(supplierID) входного supplierID параметра метода. Так как мы хотим показать продукты для поставщика, который выбран в DetailsView, используйте свойство SuppliersDetails элемента управления SelectedValue DetailsView в качестве источника параметров.

Используйте свойство SelectedValue объекта SuppliersDetails DetailsView в качестве источника параметра.

Рис. 12. Использование SuppliersDetails свойства DetailsView SelectedValue в качестве источника параметров (щелкните, чтобы просмотреть изображение полного размера)

Вернитесь в GridView, удалите все поля GridView, за исключением ProductName, QuantityPerUnit и Discontinued, пометив Discontinued CheckBoxField как доступное только для чтения. Кроме того, проверьте параметр "Включить редактирование" из смарт-тега GridView. После внесения этих изменений декларативная разметка для GridView и ObjectDataSource должна выглядеть следующим образом:

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

Как и в предыдущем объекте ObjectDataSources, для этого OldValuesParameterFormatString свойства задано значение original_{0}, что приведет к проблемам при попытке обновить название продукта или его количество на единицу. Удалите это свойство из декларативного синтаксиса полностью или задайте для него значение по умолчанию {0}.

После завершения этой конфигурации наша страница теперь перечисляет продукты, предоставляемые поставщиком, выбранным в GridView (см. рис. 13). В настоящее время можно обновить любое имя продукта или количество на единицу. Однако нам нужно обновить логику страницы, чтобы такая функциональность запрещена для прекращенных продуктов для пользователей, связанных с определенным поставщиком. Мы займемся этой завершающей частью на шаге 5.

Отображаются продукты, предоставляемые выбранным поставщиком

Рис. 13. Отображаются продукты, предоставляемые выбранным поставщиком (щелкните, чтобы просмотреть изображение полного размера)

Замечание

С добавлением этого редактируемого GridView обработчик событий Suppliers DropDownList SelectedIndexChanged следует обновить, чтобы вернуть GridView в состояние только для чтения. В противном случае, если другой поставщик выбран в середине редактирования сведений о продукте, соответствующий индекс в GridView для нового поставщика также будет изменяться. Чтобы предотвратить это, просто задайте для свойства GridView EditIndex значение -1 в обработчике события SelectedIndexChanged.

Кроме того, помните, что важно включить состояние представления GridView (поведение по умолчанию). Если вы задаете свойству EnableViewState GridView значение false, вы рискуете тем, что одновременные пользователи могут непреднамеренно удалять или редактировать записи.

Шаг 5. Запретить редактирование для прекращённых продуктов, когда не выбран Показать/Изменить ВСЕХ поставщиков

ProductsBySupplier Хотя GridView является полностью функциональным, в настоящее время он предоставляет слишком большой доступ к тем пользователям, которые являются определенным поставщиком. Согласно нашим бизнес-правилам, такие пользователи не смогут обновлять неподдерживаемые продукты. Чтобы это обеспечить, можно скрыть (или отключить) кнопку "Изменить" в строках GridView с прекращёнными продуктами, когда страницу посещает пользователь от поставщика.

Создайте обработчик событий для события GridView RowDataBound . В этом обработчике событий необходимо определить, связан ли пользователь с определенным поставщиком, который для этого руководства можно определить, проверив свойство DropDownList SelectedValue поставщиков, если оно отличается от -1, то пользователь связан с определенным поставщиком. Для таких пользователей необходимо определить, прекращен ли продукт. Мы можем получить ссылку на реальный ProductRow экземпляр, привязанный к строке GridView, через e.Row.DataItem свойство, как описано в руководстве по отображению сводной информации в подвале GridView . Если продукт снят с производства, можно получить программную ссылку на кнопку "Изменить" в CommandField GridView, используя методы, описанные в предыдущем руководстве, добавление подтверждения Client-Side при удалении. После получения ссылки мы можем скрыть или отключить кнопку.

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

При наличии этого обработчика событий, когда пользователь из конкретного поставщика посещает эту страницу, продукты, которые сняты с производства, не подлежат редактированию, так как кнопка «Изменить» для них скрыта. Например, продукт «Гамбо Микс» от Шефа Антона снят с производства у поставщика New Orleans Cajun Delights. При посещении страницы для этого конкретного поставщика кнопка "Изменить" для этого продукта скрыта от зрения (см. рис. 14). Однако при использовании функции "Показать/Редактировать всех поставщиков" становится доступна кнопка "Редактировать" (см. рис. 15).

Для Supplier-Specific пользователей, кнопка

Рис. 14. Для пользователей Supplier-Specific кнопка "Изменить" для смеси для приготовления гамбо от Шефа Антона скрыта (щелкните, чтобы просмотреть изображение в полном размере)

Для просмотра/редактирования пользователей всех поставщиков показана кнопка

Рис. 15: Для показа/редактирования всех пользователей от поставщиков отображается кнопка "Изменить" для Chef Anton's Gumbo Mix (щелкните здесь, чтобы просмотреть изображение в полном размере)

Проверка прав доступа на уровне бизнес-логики

В этом руководстве страница ASP.NET обрабатывает всю логику в отношении информации, которую пользователь может видеть и какие продукты он может обновить. В идеале эта логика также будет присутствовать на уровне бизнес-логики. Например, метод класса SuppliersBLL (который возвращает всех поставщиков) может включать проверку, чтобы убедиться, что текущий вошедший пользователь GetSuppliers() был связан с определенным поставщиком. Аналогичным образом, метод UpdateSupplierAddress может включать проверку, чтобы убедиться, что текущий пользователь работает в нашей компании (и поэтому может обновлять сведения об адресе всех поставщиков) или связан с поставщиком, чьи данные обновляются.

Я не включал такие проверки уровня BLL здесь, так как в нашем учебном пособии права пользователя определяются выпадающим списком на странице, к которой классы BLL не могут получить доступ. При использовании системы членства или одной из готовых схем проверки подлинности, предоставляемых ASP.NET (например, проверка подлинности Windows), доступ к данным пользователя и информации о ролях может быть получен из BLL, что позволяет выполнять проверки прав доступа как на уровне презентации, так и на уровне BLL.

Сводка

Большинству сайтов, предоставляющих учетные записи пользователей, необходимо настроить интерфейс изменения данных на основе пользователя, вошедшего в систему. Администраторы могут удалять и изменять любую запись, в то время как пользователи, не являющиеся административными пользователями, могут быть ограничены только обновлением или удалением записей, созданных ими. Независимо от того, какой сценарий может быть, веб-элементы управления данными, классы ObjectDataSource и бизнес-логики могут быть расширены для добавления или запрета определенных функций на основе вошедшего в систему пользователя. В этом руководстве мы узнали, как ограничить просматриваемые и редактируемые данные в зависимости от того, связан ли пользователь с определенным поставщиком или если они работали для нашей компании.

В этом руководстве мы завершаем изучение вставки, обновления и удаления данных с помощью элементов управления GridView, DetailsView и FormView. Начиная со следующего руководства, мы рассмотрим добавление поддержки разбиения по страницам и сортировки.

Счастливое программирование!

Сведения о авторе

Скотт Митчелл, автор семи книг ASP/ASP.NET и основатель 4GuysFromRolla.com, работает с технологиями Microsoft Web с 1998 года. Скотт работает независимым консультантом, тренером и писателем. Его последняя книга Sams Teach Yourself ASP.NET 2.0 за 24 часа. Его можно достичь по адресу mitchell@4GuysFromRolla.com.