ASP
.NET - Model Binding com Web Forms - Realizando o CRUD - II
Na primeira parte desta série de tutoriais apresentamos o Model Binding, criamos o modelo, o banco de dados, as tabelas e preenchemos as tabelas com dados exibindo-os em nossa aplicação.
Este tutorial mostrar como criar, atualizar e deletar dados usando o model binding pela definição das propriedades : DeleteMethod, InsertMethod e UpdateMethod
Estas propriedades recebem o nome do método que trata a operação correspondente e no método forneceremos a lógica para interação com os dados.
Vamos continuar usando o projeto criado na primeira parte do tutorial: Escola_Macoratti
Neste tutorial você vai aprender a:
Recursos usados neste tutorial:
Adicionando Dynamic data templates
Abra a solução Escola_Macoratti criado na primeira parte deste artigo.
Para fornecer a melhor experiência com o usuário e minimizar a repetição de código vamos usar dynamic data templates. Podemos fazer isso usando o Nuget.
A partir do menu TOOLS clique em Library Package Manager -> Manage Nuget Package localize e instale o pacote DynamicDataTemplatesVB.
Instale o pacote no seu projeto.
![]() |
Após a instalação verifica na janela Solution Explorer uma pasta chamada DynamicData.
Nesta pasta você encontrará os templates que serão automaticamente aplicados ao controles dinâmicos em nossos web forms.
![]() |
Habilitando a atualização e a exclusão de dados
Habilitar os usuários para atualizar e deletar registros no banco de dados é muito parecido com selecionar dados.
Nas propriedades UpdateMethod e DeleteMethod, vamos especificar os nomes dos métodos que irão realizar estas operações. Com o controle GridView podemos especificar a geração automática dos botões editar e deletar.
O código destacado em azul abaixo mostra as adições ao código do controle GridView na página Alunos.aspx:
<%@ Page Title="" Language="vb" AutoEventWireup="false" MasterPageFile="~/Site.Master" CodeBehind="Alunos.aspx.vb" Inherits="Escola_Macoratti.Alunos" %> <asp:Content ID="Content1" ContentPlaceHolderID="HeadContent" runat="server">
</asp:Content>
<asp:Content runat="server" ID="BodyContent" ContentPlaceHolderID="MainContent">
<asp:GridView runat="server" ID="alunosGrid"
ItemType="Escola_Macoratti.Macoratti.Models.Aluno" DataKeyNames="AlunoID"
SelectMethod="alunosGrid_GetDados" UpdateMethod="alunosGrid_UpdateItem"
DeleteMethod="studentsGrid_DeleteItem"
AutoGenerateEditButton="true" AutoGenerateDeleteButton="true"
AutoGenerateColumns="false">
<Columns>
<asp:DynamicField DataField="AlunoID" />
<asp:DynamicField DataField="Sobrenome" />
<asp:DynamicField DataField="Nome" />
<asp:DynamicField DataField="Ano" />
<asp:TemplateField HeaderText="Total de Créditos">
<ItemTemplate>
<asp:Label ID="Label1" Text="<%# Item.Matriculas.Sum(Function(en) en.Curso.Creditos)%>"
runat="server" />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
</asp:Content>
|
Abra o arquivo Aluno.aspx.vb e no code-behind e inclua a declaração ao namespace : imports System.Data.Entity.Infrastructure.
A seguir inclua o código abaixo para os métodos atualizar(UpdateItem) e deletar(DeleteItem):
Public Sub alunosGrid_UpdateItem(ByVal _alunoID As Integer)
Using db As EscolaContext = New EscolaContext()
Dim item As Aluno = Nothing
item = db.Alunos.Find(_alunoID)
If item Is Nothing Then
ModelState.AddModelError("", String.Format("Item com o id {0} não foi localizado", _alunoID))
Return
End If
TryUpdateModel(item)
If ModelState.IsValid Then
db.SaveChanges()
End If
End Using
End Sub
Public Sub alunosGrid_DeleteItem(ByVal _alunoID As Integer)
Using db As EscolaContext = New EscolaContext()
Dim item As Aluno = New Aluno() With {.AlunoID = _alunoID}
db.Entry(item).State = System.Data.EntityState.Deleted
Try
db.SaveChanges()
Catch ex As DbUpdateConcurrencyException
ModelState.AddModelError("", String.Format("Item com id {0} não existe mais no banco de dados.", _alunoID))
End Try
End Using
End Sub
|
O método TryUpdateModel aplica os valores correspondentes vinculados aos dados do formulário on-line para o item de dados. O item de dados é recuperado com base no valor do parâmetro ID.
A enumeração EntityState.Deleted indica que o objeto foi deletado do contexto e depois que as alterações forem salvas o estado o objeto será alterado para Detached.
Impondo requisitos de validação
Os atributos de validação que você aplicou ao nome, sobrenome e a propriedade Ano na classe Aluno são aplicadas automaticamente ao atualizar os dados. Os controles DynamicField adicionam validadores no cliente e no servidor com base nos atributos de validação. As propriedades nome e sobrenome são ambos obrigatórias. O nome não pode exceder 20 caracteres de comprimento, e o sobrenome não pode exceder 40 caracteres. O Ano deve ser um valor válido para a enumeração AnoAcademico.
Se o usuário violar um dos requisitos de validação, a atualização não vai prosseguir. Para ver a mensagem de erro, adicione um controle ValidationSummary acima do GridView. Para exibir os erros de validação do modelo de ligação, defina a propriedade ShowModelStateErrors como true no arquivo Alunos.aspx no modo Source logo acima do controle GridView:
<asp:ValidationSummary ID="ValidationSummary" ShowModelStateErrors="true" runat="server" />
Vamos executar a aplicação novamente. Observe que temos agora os botões Edit e Delete disponíveis e que podemos realizar atualizações e exclusões :
![]() |
Observe que quando estamos no modo de edição o valor para a propriedade AnoAcademico é renderizada como um dropdownlist. A propriedade Ano é um valor enumeração e o dynamic data template especifica para valores enumeração um dropdownlist. Você pode encontra este template abrindo o arquivo Enumeration_Edit.ascx na pasta DynamicData -> FieldTemplate :
![]() |
Se você fornecer valores válidos, a atualização será completada com sucesso. Se você violar um dos requisitos da validação a atualização vai falhar e uma mensagem de erro será exibida acima do controle GridView:
![]() |
Incluindo novos Registros
O controle GridView não inclui a propriedade InserMethod e por isso não pode ser usado para adicionar novos registros com o model binding. Podemos encontrar a propriedade InsertMethod nos controles FormView, DetailsView ou ListView. Neste tutorial vamos usar o controle FormView para adicionar novos registros.
A primeira coisa a fazer é incluir um link para uma nova página que vamos criar para adicionar novos registros.
Abra o arquivo Alunos.aspx e no modo Source inclua a linha de código abaixo logo acima de ValidationSummary:
| <asp:HyperLink NavigateUrl="~/IncluirAluno.aspx" Text="Incluir Novo Aluno" runat="server" /> |
Executando a aplicação novamente veremos a exibição do link conforme figura abaixo:
![]() |
Agora vamos incluir a página IncluirAluno.aspx no projeto.
No menu PROJECT clique em Add New Item e selecione o template Web Form using Master page informando o nome IncluirAluno.aspx;
Selecione a master page Site.Master e clique em OK;
Você vai renderizar os campos para adicionar um novo aluno usando um controle DynamicEntity. O controle DynamicEntity renderiza as propriedades editáveis na classe especificada na propriedade ItemType. A propriedade AlunoID foi marcada com o atributo [ScaffoldColumn (false)] de modo que não ela não será renderizada. No espaço reservado mainContent da página IncluirAluno, adicione o seguinte código:
<%@ Page Title="" Language="vb" AutoEventWireup="false" MasterPageFile="~/Site.Master" CodeBehind="IncluirAluno.aspx.vb" Inherits="Escola_Macoratti.IncluirAluno" %>
<asp:Content ID="Content1" ContentPlaceHolderID="HeadContent" runat="server">
</asp:Content>
<asp:Content runat="server" ID="BodyContent" ContentPlaceHolderID="MainContent">
<asp:ValidationSummary runat="server" ShowModelStateErrors="true" />
<asp:FormView runat="server" ID="addAlunoForm"
ItemType="Escola_Macoratti.Macoratti.Models.Aluno"
InsertMethod="addAlunoForm_InsertItem" DefaultMode="Insert"
RenderOuterTable="false" OnItemInserted="addAlunoForm_ItemInserted">
<InsertItemTemplate>
<fieldset>
<ol>
<asp:DynamicEntity runat="server" Mode="Insert" />
</ol>
<asp:Button runat="server" Text="Inserir" CommandName="Insert" />
<asp:Button runat="server" Text="Cancelar" CausesValidation="false" OnClick="cancelButton_Click" />
</fieldset>
</InsertItemTemplate>
</asp:FormView>
</asp:Content>
|
Neste código o FormView é muito similar ao formulário que foi criado usando o ASP .NET Scaffolding o qual instalamos em nosso projeto. Esta ferramenta permite que você gere views baseadas em nossos modelos para Web Forms.
No arquivo code-behind IncluirAlunos.aspx.vb inclua a declaração ao namespace
Imports Escola_Macoratti.Macoratti.Models
E a seguir inclua o código abaixo para os métodos InsertItem e ItemInserted e para o evento cancelButton:
Public Sub addAlunoForm_InsertItem()
Dim item = New Aluno()
TryUpdateModel(item)
If ModelState.IsValid Then
Using db As EscolaContext = New EscolaContext()
db.Alunos.Add(item)
db.SaveChanges()
End Using
End If
End Sub
Protected Sub cancelButton_Click(ByVal sender As Object, ByVal e As EventArgs)
Response.Redirect("~/Alunos.aspx")
End Sub
Protected Sub addAlunoForm_ItemInserted(ByVal sender As Object, ByVal e As FormViewInsertedEventArgs)
Response.Redirect("~/Alunos.aspx")
End Sub
|
Salve todas a alterações no projeto e execute a aplicação:
Ao clicar no link Incluir Aluno na página de Alunos será exibida a página abaixo que permite incluir um novo aluno:
![]() |
Informando os dados e clicando no botão Inserir um novo aluno será criado conforme mostra a página Alunos:
![]() |
Concluímos assim nosso objetivo de permitir a atualização, exclusão e inclusão de dados.
No próximo tutorial vermos como habilitar a ordenação, paginação e filtragem dos dados.
Pegue o projeto complete
até este nível aqui:
Escola_Macoratti_CRUD.zip
Referências: