.NET

30 abr, 2014

ASP .NET – Model Binding com Web Forms – Integrando JQuery UI Datepicker – Parte 04

Publicidade

Na terceira parte desta série de artigos, vimos como realizar as operações de ordenação, paginação e filtragem dos dados.

Neste artigo, 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 artigo, você vai aprender a:

  • Adicionar uma propriedade ao seu modelo para gravar datas;
  • Habilitar o usuário a selecionar uma data usando o JQuery Datepicker;
  • Impor regras de validação para datas;

Recursos usados neste artigo:

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

Esse comando adiciona uma nova coluna do tipo DateTime à tabela Aluno conforme mostra a figura a seguir:

asp-1

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:

asp-2

Adicionando controles dinâmicos à 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:

asp-3

ou editando um valor existente conforme mostra a figura a seguir:

asp-4

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 no qual 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.

asp-5

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 artigo, 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 artigo), 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:

asp-6

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.

asp-7

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:

asp-8

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

asp-9

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:

asp-10

E assim concluímos a implementação do calendário usando o Juice UI datepicker.

No próximo artigo, vamos mostrar como passar um valor em uma query string e usar o valor para retornar os dados através do model binding.