VALIDAÇÃO DE DADOS COM O PADRÃO MVC Emanuel Braz da Cruz Leonardo Soares Vianna André Lúcio de Oliveira Bruno Lessa RESUMO A validação de dados no padrão MVC consiste de atributos simples e fácil de usar em uma aplicação. Essa validação é aplicada nesse artigo mostrando a simplicidade de seu uso e a facilidade de sua implementação no padrão MVC com a linguagem de programação C Sharp. Palavras chave: Sistemas de Informação, banco de dados, linguagem de programação.
INTRODUÇÃO A implementação de uma aplicação exemplo no presente artigo consiste no projeto da aplicação do artigo com o título Projeto e Implementação de uma aplicação com o Padrão MVC, de modo que esse artigo apresenta somente o que é necessário alterar nos códigos das views e classe para alcançar o exemplo de validação. Essa medida possibilita dedicar o artigo em outros aspectos sem a necessidade de detalhes da aplicação. Validação dos Dados Para evitar que usuário submeta um formulário vazio ou mesmo que dados absurdos possam ser digitados, faz-se necessário critica-los (lembra-se de banco de dados: os dados a serem armazenados, ou processados, deverão ser criticados), antes que os mesmos possam ser submetidos. Em uma aplicação MVC, a validação é feita no próprio escopo do modelo, da classe, de modo que em qualquer ponto em que a classe for usada ou processada os dados deverão ser criticados do mesmo modo e maneira, sem a necessidade de repetir crítica. Os Atributos de Validação O MVC possui validação através de regras contidas em atributos no namespace System.ComponentModel.DataAnnotations. A figura que segue contém o modelo com estes atributos de validação: using System.ComponentModel.DataAnnotations; namespace ConviteConfraValidado.Models public class Convidado [Required(ErrorMessage="Nome é obrigatório")] public string Nome get; set; [Required(ErrorMessage = "Email é obrigatório")] [RegularExpression(".+\\@.+\\..+", ErrorMessage = "Email inválido")] public string Email get; set; [Required(ErrorMessage = "Telefone é obrigatório")] public string Telefone get; set; [Required(ErrorMessage = "Por favor, selecionar uma opção")] public bool? Aceita get; set;
A classe Convidado possui o namespace já citado para que se possa usar no código os atributos de validação. Conforme pode ser lido na mensagem de erro, as críticas dos atributos somente especifica para cada propriedade sua obrigatoriedade e, em adição, para a propriedade E-mail é criticado quanto à sua validade, isto é, se é ou não um e-mail válido. É relevante ressaltar a propriedade Aceita que possui o tipo de dado bool nullable. Caso esta propriedade fosse do tipo de dado bool, ou seja, somente aceitando true ou false, não seria possível saber se o usuário selecionou ou não uma opção, podendo até mesmo ter esquecido de selecionar uma. Com o tipo de dado bool nullable, é possível criticar e na crítica impor uma opção, se true ou false. Desta forma, o usuário, convidado, tem que selecionar uma opção. Verificação de Erros de Validação Ao criticar os dados digitados pelo convidado, os mesmos podem ou não conter erro. Desta forma, é necessário, verificar se é válido ou não o formulário. Caso seja, a aplicação deve apresentar uma view com os agradecimentos e outras informações ao convidado. Caso contrário, é necessário voltar ao formulário digitado e apresentar os erros contidos no momento da digitação. Para checar se há algum erro no modelo, ao digitar no formulário, é suficiente usar a propriedade ModelState.Isvalid na Action do Controller que decide apresentar a view de agradecimentos. Analise a view da Action RespostaForm do request [HttpPost] que, antes de retornar a view Obrigado, primeiramente verifica se está válido o modelo. A figura que segue contém somente esta Action: View antes da modificação: [HttpPost] public ViewResult RespostaForm(Convidado convidado) return View("Obrigado", convidado); View com a verificação de validade do modelo: [HttpPost] public ViewResult RespostaForm(Convidado convidado)
if (ModelState.IsValid) return View("Obrigado", convidado); else return View(); Portanto, se não há erro de validação no modelo, o código manda o MVC interpretar a view Obrigado. Mas se há erro de validação então o MVC chama a view sem parâmetros. No intuito de melhor orientar o usuário (convidado) a entender a digitação quando há erro, o uso do método helper Html.ValidationSummary na view (que apresenta os objetos do formulário a serem digitados) apresenta os erros que ocorreram e que impossibilitaram de enviar o formulário do convidado. O MVC cria uma lista escondida para listar todos os erros que ocorreram no formulário. A listagem contida na figura a seguir contém esta view com este método helper Html. ValidationSummary, logo após ao @using (Html.BeginForm): @model ConviteConfraValidado.Models.Convidado @ Layout = null; <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>resposta do formulário</title> </head> <body> @using (Html.BeginForm()) @Html.ValidationSummary() <p>por favor: </p> <p>nome: @Html.TextBoxFor(x => x.nome) </p> <p>email: @Html.TextBoxFor(x => x.email)</p> <p>telefone: @Html.TextBoxFor(x => x.telefone)</p> <p> Aceita confraternar? @Html.DropDownListFor(x => x.aceita, new[] new SelectListItem() Text = "Sim, estarei presente", Value = bool.truestring, new SelectListItem() Text = "Não, obrigado", Value = bool.falsestring
, "Selecione uma opção") </p> <input type="submit" value="resposta" /> </body> </html> Ao executar a aplicação e nenhum dos objetos contidos no formulário for digitado ou selecionado, tem-se a seguinte tela validada: Ressaltando Elementos (Objetos) Não Validados no Formulário O método HTML helper que cria os elementos ou objetos no formulário (como caixas de texto, drop-down list, área de texto, etc.) possui uma característica que possibilita o MVC apresentar o elemento com erro em uma característica que o difere dos demais elementos que foram validados sem erro. Para individualizar os objetos ou elementos de um formulário, dentre outras finalidades, é necessário criar uma folha de estilo (style sheet), denominado genericamente de CSS style. Um projeto MVC possui a
convenção de que todo conteúdo estático, tal como CSS style sheets, é adicionada em um folder, pertencente ao projeto, denominado de Content. Um projeto implementado com o template Empty não possui este folder, porém os demais templates são criados contendo este folder, incluindo o CSS style no folder. Para cria-lo é necessário clicar com o botão direito do mouse no nome projeto do Solution Explore, adicionar um folder, atribuir o nome de Content e, neste folder, criar um arquivo com o nome de Site (e extensão css). O nome do arquivo também pertence à nomenclatura do MVC. Este arquivo, CSS style sheets, é criado clicando com o botão direito do mouse sobre o folder de nome Content e selecionar a opção Add. Na lista que é apresentada selecionar a opção New Item... Em seguida clicar na opção Style Sheet na lista de opções que é apresentada. É possível também não selecionar a opção New Item e clicar na própria opção Style Sheet que também se encontra disponível na mesma lista que se encontra a opção New Item..., conforme a figura que segue:
Na página que se abre apagar o código que se encontra por default, e digitar o código que segue:.field-validation-error color: #f00;.field-validation-valid display: none;.input-validation-error border: 1px solid #f00; background-color: #fee;.validation-summary-errors font-weight: bold; color: #f00;.validation-summary-valid display: none; Para a aplicação incluir no projeto este arquivo Style Sheet, denominado de Site.css, não é suficiente implementá-lo fisicamente no folder Content. É necessário também referencia-lo (por meio de um lin) na seção head da View que vai usa-lo para ressaltar os objetos (ou elementos) do formulário. A referência a ser adicionada é: <link rel="stylesheet" type="text/css" href="~/content/site.css" /> O arquivo da view RespostaForm.cshtml deverá estar da seguinte forma: @model ConviteConfraValidado.Models.Convidado @ Layout = null; <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <link rel="stylesheet" type="text/css" href="~/content/site.css" /> <title>resposta do convidado</title> </head> <body> @using (Html.BeginForm()) @Html.ValidationSummary() <p>por favor: </p> <p>nome: @Html.TextBoxFor(x => x.nome) </p> <p>email: @Html.TextBoxFor(x => x.email)</p> <p>telefone: @Html.TextBoxFor(x => x.telefone)</p> <p> Aceita confraternar? @Html.DropDownListFor(x => x.aceita, new[]
new SelectListItem() Text = "Sim, estarei presente", Value = bool.truestring, new SelectListItem() Text = "Não, obrigado", Value = bool.falsestring, "Selecione uma opção") </p> <input type="submit" value="resposta" /> </body> </html> No MVC 3 esta referência pode ser feita da seguinte forma: @Href( ~/Content/Site.css ) ou @Url.Content( ~/Content/Site.css ). Ao executar a aplicação é apresentada a seguinte tela com os elementos validados e não validados: Observe que os elementos do formulário não validados encontram-se avermelhados e correspondem à mensagem emitida imediatamente acima destes elementos. Enviando Mensagem Para enviar o e-mail para o organizador da confraternização o MVC possui de dois recursos: o primeiro seria usar a classe de e-mail do framework.net. O segundo consiste em criar e enviar o e-mail usando o método WebMail
helper, embora, esta funcionalidade de enviar e-mail seja mais eficiente em um método action próprio. No entanto, o e-mail deve ser enviado quando ocorrer os agradecimentos pelo atendimento do convite. A seguir encontra-se a view Obrigado adicionada do envio do e-mail: @model ConviteConfraValidado.Models.Convidado @ Layout = null; <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>obrigado</title> </head> <body> @ try WebMail.SmtpServer = "smtp.gmail.com"; WebMail.SmtpPort = 587; WebMail.EnableSsl = true; WebMail.UserName = "bcemanuel@gmail.com"; WebMail.Password = "do remetente"; WebMail.From = "bcemanuel@gmail.com"; WebMail.Send("bcemanuel@gmail.com", "Agradecimento confraternar empresa", Model.Nome + ((Model.Aceita?? false)? "" : " não ") + "aceitou"); catch (Exception excp) @excp.message @:<p></p> @:<b>desculpe-me, mas não é possível o envio do e-mail!!!</b> <div> <h1>muito agradecido, @Model.Nome! </h1> @if (Model.Aceita == true) @:É um prazer termos sua presença. else @:Obrigado por comunicar, sentiremos sua falta. </div> </body> </html> A classe WebMail se encontra no name space System.Web.Helpers, portanto é um método helper, que possibilita o envio de e-mail. O WebMail
fornece subsídios para contruir e enviar mensagens de e-mail usando um Simple Mail Transfer Protocol (SMTP). As propriedades desta classe são: SmtpServer: Nome de um servidor SMTP. SmtPort Número da porta que é usado para acessar o SMTP. Geralmente, são usadas as portas no intervalo de 25 a 587. EnableSsl Propriedade para fornecer segurança na mensagem de e-mail (se o servidor hospedeiro requerer esta opção). UserName Propriedade que contém o nome da conta de quem envia o e-mail. From Contém o endereço de e-mail de quem envia. Geralmente, é o mesmo conteúdo da propriedade UserName. Password Password da conta do servidor SMTP. A classe possui o seguinte método: WebMail.Send("bcemanuel@gmail.com", "Agradecimento confraternar empresa", Model.Nome + ((Model.Aceita?? false)? "" : " não ") + "aceitou"); Onde o primeiro parâmetro é uma string contendo o e-mail de destino; o segundo é o conteúdo da mensagem, a mensagem propriamente dita; e o terceiro, opcional, é quem está enviando o e-mail.
REFERENCIAS 1-. Freeman, Adam e SANDERSON, Steven. Pro ASP.NET MVC 4,Fourth Edition. Editora Apress. 2- BEZERRA, Eduardo Princípios de análise e projeto de sistemas com UML Editor: Campus 8º Reimpressão RJ 2002. 3- ELMASRI, R. e NAVATHE, S. B. Sistemas de Banco de Dados. Editora Pearson Addison Wesley. 4- COUGO, Paulo. Modelagem Conceitual e Projeto de Banco de Dados. Editora Campus. 5- www.tiselvagem.com.br