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


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

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

Загрузить PDF-файл

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

Введение

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

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

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

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

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

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

Приступим!

Примечание

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

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

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

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

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

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

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

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

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

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

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

На этом этапе DropDownList перечисляет названия компаний поставщиков в базе данных. Однако также необходимо включить параметр "Показать/изменить все поставщики" в Раскрывающийся список. Для этого присвойте свойству DropDownList AppendDataBoundItems значение true , а затем добавьте ListItem , свойство которого Text равно "Показать/изменить все поставщики" и значение которого равно -1.Suppliers Его можно добавить непосредственно через декларативную разметку или через Designer, перейдя к окно свойств и щелкнув многоточие в свойстве DropDownList sItems.

Примечание

Дополнительные сведения о добавлении элемента Select All в список dropDownList см. в руководстве Фильтрация основных и подробных данных с помощью 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 показан снимок экрана текущего хода выполнения при просмотре в браузере.

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

Рис. 5. Раскрывающийся Suppliers список содержит элемент Show ALL ListItem, а также один для каждого поставщика (щелкните для просмотра полноразмерного изображения)

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

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

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

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

Примечание

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

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

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

<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 Раскрывающемся списке (см. рис. 6).

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

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

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

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

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

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

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

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

Использование раскрывающегося списка поставщиков в качестве источника параметра supplierID

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

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

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

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

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

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

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

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

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

Примечание

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

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

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

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

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

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

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

Использование свойства SelectedValue Для SuppliersDetails DetailsView в качестве источника параметров

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

Вернувшись в GridView, удалите все поля GridView, кроме , QuantityPerUnitи Discontinued, помечая Discontinued CheckBoxField как доступные только для ProductNameчтения. Кроме того, проверка параметр Включить редактирование из смарт-тега 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 (поведение по умолчанию). Если для свойства falseGridView задано EnableViewState значение , возникает риск того, что одновременные пользователи непреднамеренно удаляют или редактируют записи.

Шаг 5. Запрет на редактирование для продуктов с прекращением поддержки, если не выбран параметр Показать или изменить все поставщики

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

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

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

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

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

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

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

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

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

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

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

Сводка

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

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

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

Об авторе

Скотт Митчелл( Scott Mitchell), автор семи книг ASP/ASP.NET и основатель 4GuysFromRolla.com, работает с веб-технологиями Майкрософт с 1998 года. Скотт работает независимым консультантом, тренером и писателем. Его последняя книга Sams Teach Yourself ASP.NET 2.0 в 24 часах. Он может быть доступен в mitchell@4GuysFromRolla.com. или через его блог, который можно найти по адресу http://ScottOnWriting.NET.