Compartilhar via


Limitar a funcionalidade de modificação de dados com base no usuário (VB)

por Scott Mitchell

Baixar PDF

Em um aplicativo Web que permite que os usuários editem dados, contas de usuário diferentes podem ter privilégios diferentes de edição de dados. Neste tutorial, examinaremos como ajustar dinamicamente os recursos de modificação de dados com base no usuário visitante.

Introdução

Vários aplicativos Web dão suporte a contas de usuário e fornecem diferentes opções, relatórios e funcionalidades com base no usuário conectado. Por exemplo, com nossos tutoriais, convém permitir que os usuários das empresas fornecedoras façam logon no site e atualizem informações gerais sobre seus produtos - seu nome e quantidade por unidade, talvez - juntamente com informações do fornecedor, como o nome da empresa, o endereço, as informações da pessoa de contato e assim por diante. Além disso, convém incluir algumas contas de usuário para pessoas de nossa empresa para que possam fazer logon e atualizar informações do produto, como unidades em estoque, nível de reordenação e assim por diante. Nosso aplicativo Web também pode permitir que usuários anônimos visitem (pessoas que não fizeram logon), mas limitaria-os a apenas exibir dados. Com esse sistema de conta de usuário em vigor, gostaríamos que os controles da Web de dados em nossas páginas de ASP.NET oferecessem os recursos de inserção, edição e exclusão apropriados para o usuário conectado no momento.

Neste tutorial, examinaremos como ajustar dinamicamente os recursos de modificação de dados com base no usuário visitante. Em particular, criaremos uma página que exibe as informações dos fornecedores em um DetailsView editável, juntamente com um GridView que lista os produtos fornecidos pelo fornecedor. Se o usuário que está visitando a página for da nossa empresa, ele poderá: exibir as informações de fornecedores; editar seu endereço; e edite as informações de qualquer produto fornecido pelo fornecedor. Se, no entanto, o usuário for de uma empresa específica, ele só poderá exibir e editar suas próprias informações de endereço e só poderá editar seus produtos que não foram marcados como descontinuados.

Um usuário de nossa empresa pode editar qualquer informação de fornecedor

Figura 1: Um usuário de nossa empresa pode editar qualquer informação de fornecedor (clique para exibir a imagem em tamanho real)

Um usuário de um fornecedor específico só pode exibir e editar suas informações

Figura 2: Um usuário de um fornecedor específico só pode exibir e editar suas informações (clique para exibir a imagem em tamanho real)

Vamos começar!

Observação

ASP.NET sistema de associação 2.0 fornece uma plataforma padronizada e extensível para criar, gerenciar e validar contas de usuário. Como um exame do sistema de associação está além do escopo desses tutoriais, este tutorial, em vez disso, "falsifica" a associação, permitindo que visitantes anônimos escolham se são de um fornecedor específico ou de nossa empresa. Para obter mais informações sobre associação, consulte a série de artigos Examining ASP.NET 2.0's Membership, Roles, and Profile.

Etapa 1: permitir que o usuário especifique seus direitos de acesso

Em um aplicativo Web do mundo real, as informações da conta de um usuário incluiriam se eles trabalhavam para nossa empresa ou para um fornecedor específico, e essas informações seriam programaticamente acessíveis de nossas páginas de ASP.NET depois que o usuário fizer logon no site. Essas informações podem ser capturadas por meio do sistema de funções do ASP.NET 2.0, como informações de conta no nível do usuário por meio do sistema de perfil ou por meio de métodos personalizados.

Como o objetivo deste tutorial é demonstrar o ajuste das permissões de modificação de dados com base no usuário conectado e não é para mostrar os sistemas de associação, funções e perfil do ASP.NET 2.0, usaremos um mecanismo muito simples para determinar as permissões para o usuário que está visitando a página - um DropDownList do qual o usuário pode indicar se deve ser capaz de exibir e editar qualquer uma das informações de fornecedores ou, como alternativa, quais informações específicas de um fornecedor ele pode exibir e editar. Se o usuário indicar que pode exibir e editar todas as informações do fornecedor (o padrão), ela poderá percorrer todos os fornecedores, editar as informações de endereço de fornecedores e editar o nome e a quantidade por unidade para qualquer produto fornecido pelo fornecedor selecionado. Se o usuário indicar que ela só pode exibir e editar um fornecedor específico, no entanto, ela só poderá exibir os detalhes e produtos desse fornecedor e só poderá atualizar o nome e a quantidade por informação de unidade para os produtos que não são descontinuados.

Nossa primeira etapa neste tutorial, então, é criar esse DropDownList e preenchê-lo com os fornecedores no sistema. Abra a UserLevelAccess.aspx página na EditInsertDelete pasta, adicione um DropDownList cuja ID propriedade está definida Supplierse associe este DropDownList a um novo ObjectDataSource chamado AllSuppliersDataSource.

Criar um novo ObjectDataSource chamado AllSuppliersDataSource

Figura 3: Criar um novo ObjectDataSource nomeado AllSuppliersDataSource (clique para exibir a imagem em tamanho real)

Como queremos que este DropDownList inclua todos os fornecedores, configure o ObjectDataSource para invocar o SuppliersBLL método da GetSuppliers() classe. Verifique também se o método ObjectDataSource Update() está mapeado para o SuppliersBLL método da UpdateSupplierAddress classe, pois este ObjectDataSource também será usado pelo DetailsView que adicionaremos na Etapa 2.

Depois de concluir o assistente ObjectDataSource, conclua as etapas configurando o Suppliers DropDownList de modo que ele mostre o CompanyName campo de dados e use o SupplierID campo de dados como o valor para cada ListItem.

Configurar o DropDownList de fornecedores para usar os campos de dados CompanyName e SupplierID

Figura 4: Configurar o Suppliers DropDownList para usar os campos CompanyName e SupplierID de dados (Clique para ver a imagem em tamanho real)

Neste ponto, o DropDownList lista os nomes da empresa dos fornecedores no banco de dados. No entanto, também precisamos incluir uma opção "Mostrar/Editar TODOS os Fornecedores" para o DropDownList. Para fazer isso, defina a propriedade Suppliers de AppendDataBoundItemsDropDownList para true e, em seguida, adicione um ListItem cuja propriedade Text é "Mostrar/Editar TODOS os Fornecedores" e cujo valor é -1. Isso pode ser adicionado diretamente por meio da marcação declarativa ou por meio do Designer acessando a janela de Propriedades e clicando nas reticências da propriedade Items do DropDownList.

Observação

Consulte o tutorial Filtragem mestre/detalhe com um DropDownList para obter uma discussão mais detalhada sobre como adicionar um item Selecionar Tudo a um DropDownList vinculado a dados.

Depois que a propriedade AppendDataBoundItems tiver sido definida e ListItem tiver sido adicionado, a marcação declarativa do DropDownList deverá ser semelhante a:

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

A Figura 5 mostra uma captura de tela do nosso progresso atual, quando exibida por meio de um navegador.

A lista suspensa de fornecedores contém um item que mostra todos, além de um para cada fornecedor

Figura 5: O Suppliers DropDownList contém um Mostrar Tudo ListItem, mais um para cada fornecedor (clique para exibir a imagem em tamanho real)

Como queremos atualizar a interface do usuário imediatamente após o usuário alterar sua seleção, defina a Suppliers propriedade DropDownList AutoPostBack como true. Na Etapa 2, criaremos um controle DetailsView que mostrará as informações para os fornecedores com base na seleção DropDownList. Em seguida, na Etapa 3, criaremos um manipulador de eventos para este evento DropDownList SelectedIndexChanged , no qual adicionaremos um código que associa as informações de fornecedor apropriadas ao DetailsView com base no fornecedor selecionado.

Etapa 2: Adicionar um controle DetailsView

Vamos usar um DetailsView para mostrar informações do fornecedor. Para o usuário que pode exibir e editar todos os fornecedores, o DetailsView dará suporte à paginação, permitindo que o usuário percorra as informações do fornecedor um registro por vez. No entanto, se o usuário trabalha para um fornecedor específico, o DetailsView mostrará apenas as informações de fornecedores específicos e não incluirá uma interface de paginação. Em ambos os casos, o DetailsView precisa permitir que o usuário edite os campos de endereço, cidade e país do fornecedor.

Adicione um DetailsView à página abaixo do Suppliers DropDownList, defina sua ID propriedade como SupplierDetails, e associe-a AllSuppliersDataSource ao ObjectDataSource criado na etapa anterior. Em seguida, marque as caixas de seleção "Habilitar Paginação" e "Habilitar Edição" na tag inteligente do DetailsView.

Observação

Se você não vê uma opção Habilitar Edição na marca inteligente do DetailsView, é porque você não mapeou o método Update() do ObjectDataSource para o método SuppliersBLL da classe UpdateSupplierAddress. Reserve um momento para voltar e fazer essa alteração de configuração, após a qual a opção Habilitar Edição deve aparecer na marca inteligente DetailsView.

Como o SuppliersBLL método da UpdateSupplierAddress classe aceita apenas quatro parâmetros – supplierID, address, city e country – modifique os BoundFields do DetailsView para que os BoundFields CompanyName e Phone sejam somente leitura. Além disso, remova o SupplierID BoundField completamente. Por fim, o AllSuppliersDataSource ObjectDataSource atualmente tem sua OldValuesParameterFormatString propriedade definida como original_{0}. Reserve um momento para remover essa configuração de propriedade da sintaxe declarativa completamente ou defina-a como o valor padrão. {0}

Depois de configurar o SupplierDetails DetailsView e AllSuppliersDataSource o ObjectDataSource, teremos a seguinte marcação declarativa:

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

Neste ponto, o DetailsView pode ser percorrido e as informações de endereço do fornecedor selecionado podem ser atualizadas, independentemente da seleção feita no Suppliers DropDownList (consulte a Figura 6).

Todas as informações de fornecedores podem ser exibidas e seu endereço atualizado

Figura 6: Todas as informações de fornecedores podem ser exibidas e seu endereço atualizado (clique para exibir a imagem em tamanho real)

Etapa 3: Exibindo apenas as informações do fornecedor selecionado

No momento, nossa página exibe as informações para todos os fornecedores, independentemente de um fornecedor específico ter sido selecionado no Suppliers DropDownList. Para exibir apenas as informações de fornecedor para o fornecedor selecionado, precisamos adicionar outro ObjectDataSource à nossa página, um que recupera informações sobre um fornecedor específico.

Adicione um novo ObjectDataSource à página, nomeando-o SingleSupplierDataSource. Na sua tag inteligente, clique no link Configurar Fonte de Dados e faça com que ela use a SuppliersBLL classe e o GetSupplierBySupplierID(supplierID) método. Assim como acontece com o AllSuppliersDataSource ObjectDataSource, mapeie o método SingleSupplierDataSource do ObjectDataSource para o método Update() da classe SuppliersBLL.

Configurar o SingleSupplierDataSource ObjectDataSource para usar o método GetSupplierBySupplierID(supplierID)

Figura 7: Configurar o SingleSupplierDataSource ObjectDataSource para usar o GetSupplierBySupplierID(supplierID) método (clique para exibir a imagem em tamanho real)

Em seguida, será solicitado que especifique a origem do parâmetro para o GetSupplierBySupplierID(supplierID) parâmetro de entrada do supplierID método. Como queremos mostrar as informações para o fornecedor selecionado no DropDownList, use a Suppliers propriedade DropDownList como a origem do SelectedValue parâmetro.

Usar o DropDownList de fornecedores como a origem do parâmetro supplierID

Figura 8: Usar o Suppliers DropDownList como a origem do supplierID parâmetro (clique para exibir a imagem em tamanho real)

Mesmo com este segundo ObjectDataSource adicionado, o controle DetailsView está configurado para sempre usar o AllSuppliersDataSource ObjectDataSource. Precisamos adicionar lógica para ajustar a fonte de dados usada pelo DetailsView dependendo do Suppliers item DropDownList selecionado. Para fazer isso, crie um SelectedIndexChanged manipulador de eventos para o Suppliers DropDownList. Isso pode ser criado com mais facilidade clicando duas vezes no DropDownList no Designer. Esse manipulador de eventos precisa determinar qual fonte de dados usar e deve rebinar os dados ao DetailsView. Isso é feito com o seguinte código:

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

O manipulador de eventos começa determinando se a opção "Mostrar/Editar TODOS os Fornecedores" foi selecionada. Se foi, ele configura o componente SupplierDetails DetailsView DataSourceID para AllSuppliersDataSource e retorna o usuário para o primeiro registro no conjunto de fornecedores, definindo a propriedade PageIndex como 0. Se, no entanto, o usuário tiver selecionado um fornecedor específico do DropDownList, o DetailsView s DataSourceID será atribuído a SingleSuppliersDataSource. Independentemente de qual fonte de dados é usada, o SuppliersDetails modo é revertido de volta para o modo somente leitura e os dados são recuperados para o DetailsView por uma chamada para o SuppliersDetails método do DataBind() controle.

Com esse manipulador de eventos em vigor, o controle DetailsView agora mostra o fornecedor selecionado, a menos que a opção "Mostrar/Editar TODOS os Fornecedores" tenha sido selecionada, nesse caso, todos os fornecedores podem ser exibidos por meio da interface de paginação. A Figura 9 mostra a página com a opção "Mostrar/Editar TODOS os Fornecedores" selecionada; observe que a interface de paginação está presente, permitindo que o usuário visite e atualize qualquer fornecedor. A Figura 10 mostra a página com o fornecedor Ma Maison selecionado. Somente as informações do Ma Maison podem ser visualizadas e editáveis nesse caso.

Todas as informações de fornecedores podem ser exibidas e editadas

Figura 9: Todas as informações de fornecedores podem ser exibidas e editadas (clique para exibir a imagem em tamanho real)

Somente as informações do fornecedor selecionado podem ser exibidas e editadas

Figura 10: somente as informações do fornecedor selecionado podem ser exibidas e editadas (clique para exibir a imagem em tamanho real)

Observação

Para este tutorial, os controles EnableViewState DropDownList e DetailsView devem ser definidos true como (o padrão) porque as alterações do DropDownList SelectedIndex e da DataSourceID propriedade DetailsView devem ser lembradas entre postbacks.

Etapa 4: Listando os produtos fornecedores em um GridView editável

Com o DetailsView concluído, nossa próxima etapa é incluir um GridView editável que lista os produtos fornecidos pelo fornecedor selecionado. Este GridView deve permitir edições somente para os campos ProductName e QuantityPerUnit. Além disso, se o usuário que está visitando a página for de um fornecedor específico, ele só deverá permitir atualizações para os produtos que não são descontinuados. Para fazer isso, primeiro precisaremos adicionar uma sobrecarga do método da classe ProductsBLLUpdateProducts que aceita apenas os campos ProductID, ProductName e QuantityPerUnit como entradas. Percorremos esse processo com antecedência em vários tutoriais, então vamos apenas examinar o código aqui, que deve ser adicionado a 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

Com essa sobrecarga criada, estamos prontos para adicionar o controle GridView e seu ObjectDataSource associado. Adicione um novo GridView à página, defina sua propriedade ID para ProductsBySupplier, e configure-o para usar um novo ObjectDataSource chamado ProductsBySupplierDataSource. Como queremos que este GridView liste esses produtos pelo fornecedor selecionado, use o método da classe ProductsBLLGetProductsBySupplierID(supplierID). Mapeie também o Update() método para a nova UpdateProduct sobrecarga que acabamos de criar.

Configurar o ObjectDataSource para usar a sobrecarga UpdateProduct recém-criada

Figura 11: Configurar o ObjectDataSource para usar a UpdateProduct sobrecarga que acabou de ser criada (clique para exibir a imagem em tamanho real)

Fomos solicitados a selecionar a origem do parâmetro para o GetProductsBySupplierID(supplierID) parâmetro de entrada do supplierID método. Como queremos mostrar os produtos para o fornecedor selecionado no DetailsView, use a propriedade SuppliersDetails do controle DetailsView como a origem para o parâmetro SelectedValue.

Usar a propriedade SelectedValue de SuppliersDetails DetailsView como a origem do parâmetro

Figura 12: Usar a SuppliersDetails propriedade DetailsView como a origem do SelectedValue parâmetro (clique para exibir a imagem em tamanho real)

Retornando ao GridView, remova todos os campos gridView, exceto para ProductName, QuantityPerUnite Discontinued, marcando o Discontinued CheckBoxField como somente leitura. Além disso, verifique a opção Habilitar Edição na marca inteligente do GridView. Depois que essas alterações forem feitas, a marcação declarativa para GridView e ObjectDataSource deverá ser semelhante à seguinte:

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

Assim como acontece com nossos ObjectDataSources anteriores, a propriedade OldValuesParameterFormatString deste está definida como original_{0}, o que causará problemas ao tentar atualizar o nome ou a quantidade por unidade de um produto. Remova essa propriedade da sintaxe declarativa completamente ou defina-a como padrão {0}.

Com essa configuração concluída, nossa página agora lista os produtos fornecidos pelo fornecedor selecionado no GridView (consulte a Figura 13). Atualmente, o nome de qualquer produto ou a quantidade por unidade podem ser atualizados. No entanto, precisamos atualizar nossa lógica de página para que essa funcionalidade seja proibida para produtos descontinuados para usuários associados a um fornecedor específico. Abordaremos esta última peça na Etapa 5.

Os produtos fornecidos pelo fornecedor selecionado são exibidos

Figura 13: Os produtos fornecidos pelo fornecedor selecionado são exibidos (clique para exibir a imagem em tamanho real)

Observação

Com a adição desse GridView editável, o Suppliers manipulador de eventos DropDownList SelectedIndexChanged deve ser atualizado para retornar o GridView a um estado somente leitura. Caso contrário, se um fornecedor diferente for selecionado enquanto estiver no meio da edição de informações do produto, o índice correspondente no GridView para o novo fornecedor também será editável. Para evitar isso, basta definir a propriedade GridView EditIndex para -1 no manipulador de eventos SelectedIndexChanged.

Além disso, lembre-se de que é importante que o estado de exibição do GridView seja habilitado (o comportamento padrão). Se você definir a propriedade GridView EnableViewState como false, você correrá o risco de ter usuários simultâneos excluindo ou editando registros sem querer.

Etapa 5: Desativar a edição de produtos descontinuados quando a opção de mostrar/editar todos os fornecedores não estiver selecionada.

Embora o ProductsBySupplier GridView esteja totalmente funcional, ele atualmente concede muito acesso aos usuários que são de um fornecedor específico. De acordo com nossas regras de negócios, esses usuários não devem ser capazes de atualizar produtos descontinuados. Para impor isso, podemos ocultar (ou desabilitar) o botão Editar nessas linhas gridView com produtos descontinuados quando a página está sendo visitada por um usuário de um fornecedor.

Crie um manipulador de eventos para o evento GridView RowDataBound . Nesse manipulador de eventos, precisamos determinar se o usuário está ou não associado a um fornecedor específico, o que, para este tutorial, pode ser determinado verificando a propriedade de SelectedValue Fornecedores DropDownList – se for algo diferente de -1, o usuário será associado a um fornecedor específico. Para esses usuários, precisamos determinar se o produto foi descontinuado ou não. Podemos obter uma referência à instância real ProductRow vinculada à linha do GridView por meio da propriedade e.Row.DataItem, conforme discutido no tutorial Exibindo Informações de Resumo no Rodapé do GridView. Se o produto for descontinuado, poderemos obter uma referência programática ao botão Editar no CommandField do GridView usando as técnicas discutidas no tutorial anterior, adicionando Client-Side confirmação ao excluir. Depois que tivermos uma referência, poderemos ocultar ou desabilitar o botão.

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

Com esse manipulador de eventos em vigor, ao visitar esta página como um usuário de um fornecedor específico, os produtos que são descontinuados não são editáveis, pois o botão Editar fica oculto para esses produtos. Por exemplo, o Chef Anton s Gumbo Mix é um produto descontinuado para o fornecedor New Orleans Cajun Delights. Ao visitar a página deste fornecedor específico, o botão Editar para este produto fica oculto da visão (consulte a Figura 14). No entanto, ao visitar usando "Mostrar/Editar TODOS os Fornecedores", o botão Editar está disponível (consulte a Figura 15).

Para usuários Supplier-Specific, o botão Editar para o Gumbo Mix do Chef Anton está oculto

Figura 14: Para usuários Supplier-Specific, o botão Editar para o Gumbo Mix do Chef Anton está oculto (clique para exibir a imagem em tamanho real)

Para mostrar/editar todos os usuários fornecedores, o botão Editar para o Gumbo Mix do Chef Anton é exibido

Figura 15: Para Mostrar/Editar TODOS os Usuários Fornecedores, o Botão Editar para o Gumbo Mix do Chef Anton é exibido (Clique para exibir a imagem em tamanho real)

Verificando se há direitos de acesso na camada lógica de negócios

Neste tutorial, a página ASP.NET manipula toda a lógica em relação às informações que o usuário pode ver e quais produtos ele pode atualizar. Idealmente, essa lógica também estaria presente na Camada Lógica de Negócios. Por exemplo, o SuppliersBLL método da GetSuppliers() classe (que retorna todos os fornecedores) pode incluir uma verificação para garantir que o usuário conectado no momento não esteja associado a um fornecedor específico. Da mesma forma, o UpdateSupplierAddress método pode incluir uma verificação para garantir que o usuário conectado atualmente trabalhou para nossa empresa (e, portanto, pode atualizar todas as informações de endereço de fornecedores) ou está associado ao fornecedor cujos dados estão sendo atualizados.

Não incluí essas verificações de camada BLL aqui porque, em nosso tutorial, os direitos do usuário são determinados por um DropDownList na página, que as classes BLL não podem acessar. Ao usar o sistema de associação ou um dos esquemas de autenticação prontos para uso fornecidos pelo ASP.NET (como a autenticação do Windows), as informações e funções do usuário atualmente conectadas podem ser acessadas da BLL, possibilitando assim essas verificações de direitos de acesso nas camadas de apresentação e BLL.

Resumo

A maioria dos sites que fornecem contas de usuário precisa personalizar a interface de modificação de dados com base no usuário conectado. Os usuários administrativos podem ser capazes de excluir e editar qualquer registro, enquanto os usuários não administrativos podem estar limitados apenas a atualizar ou excluir registros que eles mesmos criaram. Seja qual for o cenário, os controles de dados da Web, o ObjectDataSource e as classes da camada de lógica de negócios podem ser estendidos para adicionar ou negar determinadas funcionalidades com base no usuário autenticado. Neste tutorial, vimos como limitar os dados exibantes e editáveis, dependendo se o usuário foi associado a um fornecedor específico ou se trabalhou para nossa empresa.

Este tutorial conclui nosso exame de inserção, atualização e exclusão de dados usando os controles GridView, DetailsView e FormView. A partir do próximo tutorial, vamos nos concentrar em adicionar suporte a paginação e ordenação.

Divirta-se programando!

Sobre o autor

Scott Mitchell, autor de sete livros asp/ASP.NET e fundador da 4GuysFromRolla.com, trabalha com tecnologias da Microsoft Web desde 1998. Scott trabalha como consultor independente, treinador e escritor. Seu último livro é Sams Teach Yourself ASP.NET 2.0 em 24 Horas. Ele pode ser alcançado em mitchell@4GuysFromRolla.com.