ASP.NET MVC – ModelBinder para datas brasileiras

Olá meu caro leitor(a).

Nesse post venho trazer um problema que tivemos em um dos projetos ASP.NET MVC 5 que desenvolvemos e também demonstrar a solução para este problema que pode ser recorrente para muitos.

Sobre o problema

Temos um formulário que possui dois campos que irão receber dados no formato de data. Quando realizamos o submit desse formulário para o nosso server com o valor “31/01/2017” por exemplo, quando o ASP.NET MVC realiza o bind dos valores sempre é demonstrado o valor da propriedade do nosso objeto com o valor DateTime.MinValue, pelo fato do ModelBinder do ASP.NET MVC não conseguia realizar o parse do dado usando as configurações regionais (cultura) da máquina.

A solução

Para resolver esse problema, foi criado um ModelBinder customizado para o tipo “DateTime” que terá a responsabilidade de efetuar o parse da data para o formato brasileiro.

Abaixo está o código do binder customizado:

using System;
using System.Globalization;
using System.Web.Mvc;

namespace CustomModelBinder
{
    /// <summary>
    /// Classe que irá realizar o bind dos dados para os campos do tipo data no formato "PtBr".
    /// </summary>
    public class BrazilianDateTimeModelBinder : IModelBinder
    {
        /// <summary>
        /// Realiza o parse do valor para a data no formato "pt-BR".
        /// </summary>
        /// <param name="controllerContext">Objeto do contexto do controller.</param>
        /// <param name="bindingContext">Objeto do contexto do Model binding.</param>
        /// <returns>Retorna o valor do dado realizado o parse.</returns>
        public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {
            if (controllerContext == null)
            {
                throw new ArgumentNullException(nameof(controllerContext));
            }

            if (bindingContext == null)
            {
                throw new ArgumentNullException(nameof(bindingContext));
            }

            ValueProviderResult valueProviderResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);

            if (string.IsNullOrEmpty(valueProviderResult.AttemptedValue))
            {
                return valueProviderResult.AttemptedValue;
            }

            // Tenta converter a data para formato brasileiro.
            DateTime parsedDate;
            var parsed = DateTime.TryParse(valueProviderResult.AttemptedValue, CultureInfo.GetCultureInfo("pt-BR").DateTimeFormat, DateTimeStyles.None, out parsedDate);

            // Se não consegue realizar o parse da data será adicionado um erro no ModelState.
            if (!parsed)
            {
                bindingContext.ModelState.AddModelError(bindingContext.ModelName, "Data inválida");
            }

            return parsedDate;
        }
    }
}

Com a criação dessa classe devemos adicionar no dicionários de “binders” do ASP.NET MVC qual é o tipo específico que deve utilizar esse binder customizado para realizar o parse dos dado.

Geralmente utilizo a abordagem de criar uma classe estática de configuração na pasta “App_Start” da aplicação que irá conter um método estático para registrar os binders customizados. Mas caso não queira seguir essa abordagem, pode informar os dados das linhas 16 e 17 no seu arquivo Global.asax:

using System;
using System.Web.Mvc;

namespace CustomModelBinder
{
    /// <summary>
    /// Arquivo de configuração para registrar os "ModelBinder" customizados.
    /// </summary>
    public static class ModelBinderConfig
    {
        ///<summary>
        /// Registra os "ModelBinder" customizados.
        /// </summary>
        public static void RegisterModelBinders()
        {
            ModelBinders.Binders.Add(typeof(DateTime), new BrazilianDateTimeModelBinder());
            ModelBinders.Binders.Add(typeof(DateTime?), new BrazilianDateTimeModelBinder());
        }
    }
}

Notem que estamos registrando o ModelBinder customizado para os tipos “DateTime” e “DateTime?” (objetos do tipo DateTime que podem ser nulos).

Com a classe de configuração criada, basta informar no arquivo Global.asax a chamada para o método “RegisterModelBinders“:

namespace CustomModelBinder
{
    public class MvcApplication : HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);

            // Registra os binders para dos dados das requisições.
            ModelBinderConfig.RegisterModelBinders();
        }
    }
}

Conclusão

Como visto, o problema foi resolvido usando um dos recursos que o ASP NET MVC nós proporciona e essa abordagem nos dá liberdade de criarmos os nossos próprios binders, assim tratando os dados conforme necessitamos.

Caso tenha interesse em criar um binder para realizar o parse de valores monetários, sugiro o post “Model Binding Decimal Values” que demonstra essa abordagem.

Espero que tenham gostado do post e também espero essa solução ajudem outros a solucionarem esse problema de data no formato brasileiro.

Obrigado pela leitura e até o próximo post.

Legolas

Ext JS por onde começar

Olá meu caro leitor(a), nesse post eu irei colocar algumas dicas para quem está iniciando ou para quem já iniciou seus estudos/desenvolvimento com o framework Ext JS da Sencha.

Sei que muitos que irão ler esse post sentem ou sentiram alguma dificuldade quanto iniciaram com o framework e isso meus caros(as)  leitores(as) é algo muito comum, pois o framework é extenso e geralmente há mais de uma maneira de se chegar no mesmo resultado e essa é uma das principais dúvidas que vejo nós fóruns onde muitos se questionam “será que essa forma é a correta”?

Então tentarei deixar para vocês aqui nesse post o caminho das pedras para aqueles que querem ter um norte de onde devem começar ou como podem se atualizar.

Um pouco da minha história com Ext JS

Em meados de 2007 eu iniciei os meus estudo para tentar ver se conseguia entender e utilizar o framework que na época estava na versão 2.x, porém o início dos meus estudos foram um tanto quanto frustrantes pelo fato dos meus conhecimentos na área de desenvolvimento serem limitados, pois não tinha muito conhecimento em POO (Programação Orientada a Objetos), POE (Programação Orientada a Eventos) e meus conhecimentos com a linguagem JavaScript se limitava a um alerta na tela e validação de formulários HTML. ;(

Mesmo com tanta coisa contra, antes de jogar a toalha resolvi que tinha que aprender muito ao invés de imergir nos estudos com Ext JS, daí após dois anos voltei para meus estudos com o framework que já estava na versão 3.x, que teve algumas mudanças com relação a versão anterior, porém como estava praticamente começando do zero não fazia tanta diferença para mim.

Após algum tempo de estudos, criação de alguns laboratórios e muitos erros, consegui entender como as coisas funcionam. O grande mérito disso se deu pelo fato de ter melhorado os meus conhecimentos, principalmente na linguagem JavaScript. Uma outra parte desse mérito pode ser dada pela minha participação na comunidade brasileira sobre o framework, pois enquanto eu participava tentando ajudar a sanar a dúvidas dos outros membros eu também aprendia mais sobre o framework.

Estude JavaScript

Com certeza esse é um ponto em que muitos dos desenvolvedores que utilizam o framework irão lhe falar para começar. De forma geral muitas das dúvidas que vemos nos fóruns se dão pelo fato de muitos desconhecerem a linguagem JavaScript.

Há varias cursos, tutorias e vídeos na Internet que podem lhe ajudar a melhorar o seu conhecimento na linguagem, porém como não é o intuito desse post, não irei colocar links de referência. Se você não se sente seguro na linguagem base do framework, o primeiro passo é dar um passo para trás e aprender mais sobre ela.

Essa dica vale para qualquer framework que você irá utilizar independente da linguagem, pois para utilizarmos algo devemos pelo menos saber como as coisas podem estar acontecendo debaixo dos panos, ou seja, devemos ter o domínio da linguagem base do framework a fim de termos discernimento para sabermos como as coisas podem estar funcionando e também para futuras frustrações ao encontrar um erro, porque assim com o entendimento da linguagem pode se tornar mais fácil achar a solução do problema.

Use e abuse da documentação

Parafraseando a Loiane Groner, “A documentação é a sua melhor amiga”.

Geralmente a documentação que dita como será a facilidade de se aprender e/ou entender o framework e esse é um ponto onde o pessoal da Sencha sempre acertou (minha opinião), pois a sua documentação é rica em informações.

Abaixo irei colocar alguns links retirados da documentação do Ext JS (versão 6.x) que poderá lhe ajudar a aprender sobre o framework.

Sencha Ext JS Guides: se estás começando um excelente caminho das pedras seria o guia que existe na documentação. Esse guia é dividido em oito módulos  que lhe darão uma boa visão do framework como a instalação/configuração, o sistema de classes (Class system), os componentes, pacotes de dados (Data Package) que recomendo a leitura, entre outros tópicos.

Basic of OOP: como já tinha mencionado, o desenvolvimento com o Ext JS se dá pela programação orientada a objetos (POO) e como JavaScript utiliza um modelo de orientação a objetos baseado em protótipos o pessoal da Sencha desenvolveu o framework utilizando os conceitos de POO e assim criando o seu class system de forma que possamos utilizar todos os conceitos de orientação a objetos de forma mais parecida como as linguagens de auto nível utilizam. Sendo assim esse tópico da documentação irá lhe dar um overview de como é a POO no ambiente Sencha.

Create a Sample Login App: esse link é referente ao um tutorial onde será criado uma aplicação com uma tela de autenticação. Porém se atentem que esse exemplo é referente ao toolkit classic (browser em desktops), pois muitos confundem e também pensam que essa aplicação irá funcionar para aplicações do toolkit modern (dispositivos móveis). Nesse tutorial você poderá utilizar os conhecimentos obtidos no guia como a utilização da arquitetura MVVM, criação de classes, relacionamento entre View e ViewController, entre outros pontos. Se você já viu a parte base dos guias eu lhe indico fazer esse tutorial que é bem simples e sucinto, pois assim você conseguirá assimilar as coisas.

Sencha examples: a Sencha disponibiliza vários exemplos demonstrando a utilização dos componentes, classes e as arquiteturas do framework, alguns desses exemplos são bem completos e também complexos para iniciantes como o Kitchen Sink, mas já ajuda a entender a utilizar vários componentes, classes. Esse exemplo é um excelente material de estudos, mas será necessário um bom entendimento do framework e da arquitetura MVVM, porém não é impossível similar a aplicação. Esses exemplos também estão disponíveis no sdk do framework, assim dá para ver o código fonte ficando mais fácil estudar a implementação do exemplo.

Api Documentation toolkit classic e modern: por último e não menos importante, a documentação em si do framework. Na versão 6.x há dois tipos de documentação que é separado por toolkit classic e modern, porém a pesquisa pode ser realizada tanto para as classes de ambos toolkits ou somente para o toolkit que deseja.
O melhor ponto da documentação é que o código fonte das classes estão lá para seu uso e fruto, assim podendo ser analisado o seu código como por exemplo, a implementação dos seus métodos. A imagem abaixo demonstra o link disponível para acessar o método “isValid” da classe Ext.form.Panel.

form

Analisar as implementações do framework irá lhe ajudar a entender melhor sobre como funcionam as coisas e também a melhorar o seus conhecimentos da linguagem JavaScript, pois algumas implementação demonstram a utilização de recursos da linguagem que as vezes não tínhamos conhecimento.

A documentação é rica em informações e tudo está disponível para nós, somente temos que ter paciência para entender como as coisas funcionam e assim similar as informações, então gaste um tempo lendo a documentação e quando for utilizar uma classe dê uma olhada em suas propriedades, métodos, eventos que desta forma, gradativamente você irá assimilar as propriedades e métodos mais apropriados para aplicar nas classes que você mais utiliza.

Faça um curso sobre Ext JS

Treinamentos Sencha: a Sencha disponibiliza alguns treinamentos pagos que são bem completos e também bem caros, porém abrange os produtos da empresa.

Curso Ext JS 4: esse é um curso em português e free ministrado pela Loiane Groner. Esse curso foi elaborado para a versão 4.x do framework, porém ele dá uma boa base sobre o Ext JS. Se você está iniciando ou já conhece o framework, porém ainda tem dúvidas de como funcionam as coisas esse curso é para você.

Dominando Sencha Ext JS 6: a empresa Novanti Tecnologia e Consultoria possui um curso com foco na versão 6.x do framework que é ministrado pelo Wermerson Januário. É um curso pago, porém o conteúdo ministrado irá lhe dar uma bagagem completa do framework e também um know how como boas práticas no desenvolvimento de sistemas com Ext JS. O curso pode ser feito In Company or pelo Skype. Se você esta iniciando ou está querendo evoluir seus conhecimentos do framework, eu lhe indico esse curso.

Seja ativo nos fóruns

Participar nos fóruns pode lhe ajudar a evoluir os seus conhecimentos (assim como me ajudou). Existem alguns fóruns sobre Ext JS eu recomento dois o Ext JS BR que é a nossa comunidade brasileira e outro fórum seria o oficial da Sencha que é bem mais ativo, pois há algumas pessoas que trabalham no suporte da Sencha ajudam a sanar as dúvidas no fórum e também a quantidade de membros ativos é bem maior.

Os dois fóruns são excelentes, já possuem algumas dicas, exemplos e principalmente dúvidas sanadas, porém o mais importante é participar e uma das principais formas seriam postando exemplos do que você aprendeu, dicas e/ou tutoriais sobre o framework e também suas dúvidas, pois futuramente outros membros podem passar pelo mesmo problema que você.

Faça um laboratório

Assim como os cientistas uma boa forma de entender as coisas é realizando testes que as vezes podem ser frustrantes, mas quando são assertivos ai temos o conhecimento para evoluir.

Geralmente crio laboratórios que são pequenos projetos para similar os meus conhecimentos no framework e isso me ajuda bastante, pois um laboratório nada mais é que um bom lugar para tentarmos construir algo, porém as vezes acontece de errarmos, mas é assim que conseguimos chegar nos acertos.

Então crie um pequeno projeto e comece a utilizar o framework, não se preocupe no início de ser assertivo ou até mesmo em fazer tudo perfeito, pois refatoração é dos passos de uma boa prática de programação e isso lhe irá fazer um desenvolvedor melhor.

Com um laboratório criado comece a evoluir ele, veja o que tem na documentação que você não está utilizando e assim implemente no seu laboratório, faça dele a sua escola para evoluir os seus conhecimento e lembre-se que quando tiver algo novo um bom laboratório pode lhe ajudar a entender melhor a implementação.

Ufa acho que é isso ai, tentei colocar para vocês algumas das dicas que eu vejo que podem lhe ajudar em seu desenvolvimento utilizando Ext JS e sei que é bastante conteúdo para se estudar e isso demanda um bom tempo de aprendizado, mas não desista e nem desanime, tente traçar um plano de estudo e focar no seu objetivo.

Muitos deixaram de lado a utilização do framework pela sua complexidade e eu sei que a curva de aprendizado é não é pequena, mas se fosse fácil não daríamos tanto valor assim.

Espero que tenha lhe ajudado com esse post e se tiver alguma dica ou sugestão por favor deixe o seu comentário.

Agradeço a leitura e até o próximo.

Legolas.

Logo C#

C# por onde começar

Olá meu caro leitor(a), nesse post irei colocar algumas dicas e links de materiais de estudo para aqueles que estão iniciando ou que querem iniciar no desenvolvimento com a linguagem C#.

Em meados de 2012 eu tive a oportunidade/desafio de trabalhar utilizando a linguagem C# e as tecnologias .NET. Como minhas origens se baseiam na linguagem PHP e JavaScript tive alguns quebras de paradigmas para me adaptar a nova linguagem que digo de passagem que é uma senhora linguagem.

O bom de ter vindo de uma linguagem não tão robusta como C# (sei que alguns não pensam assim de PHP, mas é a minha visão sorry) é que começamos a quebrar alguns paradigmas/dogmas que com o tempo se tornam engessados em nosso conhecimento. Aprendi e continuo aprendendo muito com essa nova linguagem, aprimorei em muito minha orientação a objetos, designer patterns, entre outros.

Quando recebi essa oportunidade a primeira coisa que fiz foi procurar cursos, livros e tutoriais para conseguir adquirir conhecimentos o suficiente para as demandas diárias do meu trabalho, após ler vários posts e também realizar alguns cursos consegui pegar a ideia inicial ou melhor falando, conseguir encontrar o caminho das pedras.

Mas não parei por ai, pois mesmo após eu ter sentido que estava mais seguro na linguagem ainda continuei estudando para aprender e aprimorar mais os meus conhecimentos e até esse exato momento continuo estudando não pelo fato de ter pouco conhecimento após esses anos imergidos na linguagem e suas tecnologias, mas pelo fato de que sempre há algo novo a se aprender ou evoluir.

Desta forma assim como eu, muitos estão começando ou pensando em começar na plataforma .NET e principalmente com a linguagem C#. Sendo assim resolvi escrever esse pots para colocar alguns links que me ajudaram e sei que irão lhe ajudar a encontrar o caminho das pedras para se tornar um bom desenvolvedor C#.

Cursos e Vídeos:

Começando do Zero: Esse é um repositório no GitHub do MVP Rodrigo Kono que tem alguns vídeos que pode ajudar os iniciantes na linguagem e também em outras ferramentas que a tecnologia .NET proporciona. É bem bacana essa iniciativa, pois os vídeos são curtos e dá uma boa visão das tecnologias.

Começando do Zero: .NET Developer: Vídeo da série ASP.NET Cast. Esse é o quinto episódio e como o nome do vídeo já menciona lhe dá algumas dicas de como começar no mundo .NET.

C# Fundamentals for Absolute Beginners: Curso em inglês (áudio e legendas) free. Dá uma excelente visão da linguagem, suas features e também de como utilizar o Visual Studio. O instrutor Bob Tabor tem uma excelente didática fazendo o curso ser de fácil entendimento.

C# Best Practices: Improving on the Basics: Outro curso em inglês (áudio) pago (pode ser realizado o cadastro na Pluralsight e obter um período de degustação). Se você é iniciante na linguagem então deve fazer esse curso. Ele é um complemento ao curso informado acima, a instrutora Deborah Kurata dá várias dicas sobre a linguagem C# e algumas dessas dicas utilizando os novos recursos da versão 6 do C#.

Também a evolução dos módulo se dá utilizando os conceitos de TDD (Test Driven Development – Desenvolvimento Orientado por Testes) onde em uns dos primeiros módulos é criado um projeto de teste para que na evolução da aplicação sejam executados os testes unitários para garantir a qualidade e integridade do projeto.

O que mais me chamou atenção nesse curso foi a questão de em cada módulo é feito uma reflexão do que foi demonstrado e também no final tem uma seção FAQ com as principais dúvidas sobre os conteúdos do módulo. É um excelente curso para iniciantes na linguagem e também para aqueles que almejam desenvolver de forma mais coesa com as boas práticas na linguagem.

Treinamento de ASP.NET MVC 5 Conceitos Básicos: Curso em português do Renato Haddad free. O curso demonstra os conceitos básicos sobre o ASP.NET MVC 5, mas já é uma boa base para iniciar no desenvolvimento Web com C#.

Curso de ASP.NET MVC 5 – Enterprise Applications: Curso em português do Eduardo Pires pago. Um curso avançado, pois aborda vários conceitos como utilização do ASP.NET MVC, criação de arquitetura, designer patterns, ORM, entre outros módulos. Sendo assim é essencial ter uma base inicial para que o conteúdo do curso seja mais aproveitado, mas nada impede que seja realizado o curso e depois seja revisto, pois estará disponível (por um período) para que o aluno o veja novamente.

Posts e tutoriais:

10 Coisas que todo desenvolvedor .NET deveria saber: Coloco esse link como o primeiro, pois compartilho de algumas das dicas do Rodrigo Kono sobre o que os desenvolvedores .NET deveriam saber. Vale muito a pena olhar as referências do post e também dar uma olhada nos comentários.

Getting Started with C#: Como o próprio nome do post já indica, se trata de um tutorial de inicialização na linguagem C#. Nele há vinte lições (tópicos) em Inglês que irão demonstrar de forma simples os recursos que a linguagem possui. Pelo meu ponto de vista, esse tutorial se enquadra para pessoas que estão começando na linguagem, se é o seu caso recomendo finalizar as vinte lições.

C# Examples: Site que contém vários exemplos que pode lhe ajudar a entender ou implementar algo na linguagem C#. Essa é uma dica do meu amigo Ricardo Concordia.

C# Documentation: E claro não poderia faltar o link da documentação do C#, pois esse é um dos lugares que tenho certeza que assim como eu, você irá gastar um bom tempo de sua vida lendo os tópicos e exemplos.

Eduardo Pires: vou colocar aqui o blog do MVP Eduardo Pires, pois lá tem bastante conteúdo para quem está começando. Tem dicas, tutoriais e cursos. Dedique um pouco do seu tempo para ler os posts tanto os atuais e quanto os antigos, pois eles irão lhe dar uma luz para os futuros problemas e as demandas no seu dia a dia de desenvolvimento. Há, e também tem uma serie de posts sobre C# Para iniciantes, depois dá uma olhada lá 😉

Então é isso, mas claro que há muitos outros cursos, vídeos, tutoriais e outras fontes para se estudar, porém tentei deixar aqui alguns links para lhe ajudar no seu startup e a conhecer melhor a linguagem C#.

O aprendizado é continuo, então sempre tente se atualizar com as novidades ou até mesmo com o que já existe que você ainda não domina na linguagem/tecnologia.

Agradeço a leitura e espero que essas dicas lhe ajude.

Abraço e até o próximo post.

Legolas.

Bem vindo ao novo blog ;)

Olá meu caro leitor(a), há tempos venho sumido do mundo virtual, mas agora tentarei estar mais ativo no blog e nas comunidades que participo.

Os anos que se passaram foram muito turbulentos e tive que deixar um pouco de lado o meu antigo blog, mas espero que de agora em diante possa estar mais tranquilo para fazer o que eu mais gosto, disseminar o meu conhecimento.

Sei que não sou digno de ser chamado de um grande guru do desenvolvimento, mas tentarei através de nesse novo blog passar para vocês um pouco do conhecimento que tenho e também o conhecimento/aprendizado do meu dia a dia na área de desenvolvimento.

Como muitos já sabem sou um fanático pela linguagem JavaScript e também um amante do framework Ext JS da Sencha, porém tentarei abordar aqui algumas outras tecnologias que utilizo em meu dia a dia como por exemplo, a plataforma .NET principalmente sobre a linguagem C#, também sobre a linguagem PHP, conceitos de desenvolvimento, entre outros.

Então sejam bem vindos ao meu novo blog e espero que o conteúdo que irei postar possa ajudar há muitos e principalmente a mim, pois mesmo ensinando nós aprendemos.

Um forte abraço e boa leitura para todos.

Legolas.