ASP .NET - Model Binding com Web Forms - Integrando JQuery UI Datepicker - IV
Na terceira parte desta série de tutoriais vimos como realizar as operações de ordenação, paginação e filtragem dos dados.
Neste tutorial vamos incrementar a interface com o usuário pela interação com jQuery Datepicker com o Web Form e usar o model binding para atualizar o banco de dados com o valor selecionado.
Vamos continuar usando o projeto criado na primeira parte do tutorial : Escola_Macoratti
Neste tutorial você vai aprender a:
Recursos usados neste tutorial:
O JQuery UI Datepicker permite que os usuários selecionem a data a partir de um calendário que é exibido na tela quando o usuário interage com o campo de data. Para realizar a integração do componente JQuery com o model binding não requer muito trabalho.
Adicionando uma nova propriedade ao modelo
Abra a solução Escola_Macoratti criada na primeira parte deste artigo.
Na pasta Models abra o arquivo EscolaModel.vb o código destacado em azul abaixo na classe Aluno que define o campo DataMatricula como do tipo DateTime :
Public Class Aluno <Key, Display(Name:="ID")> _ <ScaffoldColumn(False)> _ Public Property AlunoID() As Integer <Required, StringLength(40), Display(Name:="Sobrenome")> _ Public Property Sobrenome() As String <Required, StringLength(20), Display(Name:="Nome")> _ Public Property Nome() As String <EnumDataType(GetType(AnoAcademico)), Display(Name:="Ano Acadêmico")> _ Public Property Ano() As AnoAcademico <Range(GetType(DateTime), "1/1/2013", "1/1/3000", ErrorMessage:="Informe uma data de matrícula depois de 1/1/2013")> <DisplayFormat(ApplyFormatInEditMode:=True, DataFormatString:="{0:d}")> Public Property DataMatricula As DateTime Public Overridable Property Matriculas() As ICollection(Of Matricula) End Class |
O atributo Range incluído impõe a regra de validação para a propriedade. No exemplo estamos impondo que a data de matrícula informada deve ser superior a 1 de janeiro de 2013.
Vamos agora ajustar o nosso modelo de dados usando migrations.
No menu TOOLS clique em Library Package Manage -> Package Manager Console e a seguir na janela Package Management digite o comando add-migration addDataMatricula:
Este comando adiciona uma nova coluna do tipo DateTime à tabela Aluno conforme mostra a figura a seguir:
Para coincidir com o valor especificado na RangeAttribute, adicionar um valor padrão para a nova coluna, como mostrado no código destacado em azul abaixo:
Namespace Migrations Public Partial Class addDataMatricula Inherits DbMigration Public Overrides Sub Up() AddColumn("dbo.Alunoes", "DataMatricula", Function(c) c.DateTime(nullable:=False, defaultValue:=New DateTime(2013, 1, 1))) End Sub Public Overrides Sub Down() DropColumn("dbo.Alunoes", "DataMatricula") End Sub End Class End Namespace |
Salve as alterações para o arquivo de migração.
Como não precisamos alimentar os dados novamente vamos abrir o arquivo Configuration.vb na pasta Migrations e comentar o código do método Seed. Salvar e fechar o arquivo.
Agora execute o comando update-database na janela Package Manager Console;
Se você abrir a tabela Aluno verá que o compo DataMatricula já foi incluído com os valores padrão conforme abaixo:
Adicionando controles dinâmicos para a data de matrícula
Vamos agora incluir controles para exibir e editar a data de matrícula. Neste ponto, o valor é editado usando uma caixa de texto, posteriormente vamos alterar a caixa de texto para o controle jQuery UI Datepicker.
Não precisamos fazer nenhuma alteração na página IncluirAluno.aspx o controle DynamicEntity irá automaticamente renderizar a nova propriedade. (basta indicarmos o campo no arquivo)
Abra a página Alunos.aspx e inclua o código destacado em azul abaixo que inclui o campo DataMatricula como DynamicField:
... <asp:GridView runat="server" ID="alunosGrid" ItemType="Escola_Macoratti.Macoratti.Models.Aluno" DataKeyNames="AlunoID" SelectMethod="alunosGrid_GetDados" UpdateMethod="alunosGrid_UpdateItem" DeleteMethod="alunosGrid_DeleteItem" AutoGenerateEditButton="true" AutoGenerateDeleteButton="true" AutoGenerateColumns="false" AllowPaging="True" AllowSorting="True" PageSize="5"> <Columns> <asp:DynamicField DataField="AlunoID" /> <asp:DynamicField DataField="Sobrenome" /> <asp:DynamicField DataField="Nome" /> <asp:DynamicField DataField="Ano" /> <asp:DynamicField DataField="DataMatricula" /> <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> ... |
Execute o projeto novamente e perceba que podemos definir valores para data de matrícula digitando diretamente na caixa de texto quando estamos incluindo um novo aluno:
ou editando um valor existente conforme mostra a figura a seguir:
Digitar uma data diretamente no campo texto pode não ser a melhor interface que o usuário pode ter. A seguir veremos como podemos melhorar a interface incluindo um calendário onde o usuário poderá selecionar uma data.
Instalando o pacote Nuget para usar o JQuery UI
O pacote Juice UI do Nuget permite realizar uma fácil integração do JQuery UI widgets em nossa aplicação web.
No menu TOOLS clique em Library Package Manage -> Manage Nuget Package for Solution;
Na janela a seguir selecione o pacote Juice UI e clique no botão Install;
Confirme a instalação e aguarde até que o processo termine com sucesso.
A versão do Juice UI que você instalou pode entrar em conflito com a versão do JQuery na sua aplicação. Antes de prosseguir com este tutorial, tente executar o aplicativo. Se você encontrar um erro de JavaScript, é preciso conciliar a versão JQuery.
Você pode adicionar a versão esperada do JQuery para a pasta Scripts (versão 1.8.3 no momento da escrita deste tutorial), ou no arquivo Site.master especificar o caminho para o arquivo JQuery incluindo a linha abaixo:
<asp:ScriptReference Name="jquery" Path="~/Scripts/jquery-1.8.3.js" />
Personalizando o template DateTime para incluir o Widget Datepicker
Vamos adicionar o widget Datepicker para o modelo dinâmico de dados para a editar um valor Datetime. Ao adicionar o widget para o modelo, ele é automaticamente processado no formulário para incluir um novo aluno e no GridView para editar os alunos.
Abra o arquivo DateTime_Edit.ascx, na pasta DynamicData->FieldTemplates e adicione o seguinte código:
No arquivo code-behind DateTime_Edit.ascx.vb, vamos definir as datas mínimas e máximas para o DatePicker. Ao definir esses valores, vamos impedir que os usuários naveguem para datas inválidas. Vamos recuperar os valores mínimo e máximo de RangeAttribute na propriedade DateTime, se uma delas for fornecida.
Abra o arquivo DateTime_Edit.ascx.vb e adicione o seguinte código para o método Page_Load.
Agora execute a aplicação:
Navegando para a página para incluir um novo aluno ao informar os valores no campo DataMatricula teremos a exibição do calendário:
Escolha uma data e clique em Inserir. O RangeAttribute impõe a validação no servidor. Ao definir a propriedade minDate no Datepicker, ela também aplica a validação no cliente. O calendário não permite que o usuário navegue para uma data anterior ao valor de minDate.
Editando um registro ao acessarmos o campo DataMatricula o calendário também é exibido conforme abaixo:
Antes de concluir o arquivo um pequeno detalhe. Você notou que o calendário esta em inglês ?
Como fazer para 'traduzir' o calendário para o português ?
Simples...
Baixe o pacote para a linguagem portuguesa neste link: http://jquery-ui.googlecode.com/svn/tags/latest/ui/i18n/
Coloque o pacote na pasta scripts do projeto.
A seguir inclua a referência ao pacote baixado no arquivo Site.master:
<asp:ScriptReference Name="jquery" Path="~/Scripts/jquery.ui.datepicker-pt-BR.js" />
Abaixo vemos o trecho do arquivo Site.Master com a alteração:
<asp:ScriptManager runat="server"> <Scripts> <%--Framework scripts--%> <asp:ScriptReference Name="MsAjaxBundle" /> <asp:ScriptReference Name="jquery" Path="~/Scripts/jquery-1.8.3.js" /> <asp:ScriptReference Name="jquery" Path="~/Scripts/jquery.ui.datepicker-pt-BR.js" /> <asp:ScriptReference Name="jquery" /> <asp:ScriptReference Name="jquery.ui.combined" /> <asp:ScriptReference Name="WebForms.js" Assembly="System.Web" Path="~/Scripts/WebForms/WebForms.js" /> <asp:ScriptReference Name="WebUIValidation.js" Assembly="System.Web" Path="~/Scripts/WebForms/WebUIValidation.js" /> <asp:ScriptReference Name="MenuStandards.js" Assembly="System.Web" Path="~/Scripts/WebForms/MenuStandards.js" /> <asp:ScriptReference Name="GridView.js" Assembly="System.Web" Path="~/Scripts/WebForms/GridView.js" /> <asp:ScriptReference Name="DetailsView.js" Assembly="System.Web" Path="~/Scripts/WebForms/DetailsView.js" /> <asp:ScriptReference Name="TreeView.js" Assembly="System.Web" Path="~/Scripts/WebForms/TreeView.js" /> <asp:ScriptReference Name="WebParts.js" Assembly="System.Web" Path="~/Scripts/WebForms/WebParts.js" /> <asp:ScriptReference Name="Focus.js" Assembly="System.Web" Path="~/Scripts/WebForms/Focus.js" /> <asp:ScriptReference Name="WebFormsBundle" /> <%--Site scripts--%> </Scripts> </asp:ScriptManager> |
Executando novamente o projeto e acionando o calendário veremos agora o mesmo em português:
E assim concluímos a implementação do calendário usando o Juice UI datepicker.
No próximo tutorial vamos mostrar como passar um valor em uma query string e usar o valor para retornar os dados através do model binding.
Referências: