Captulo VII
O servidor web. Conceitos avanados
Validao
O que a validao? Imaginemos que vocs tm um site na
web, onde as pessoas se cadastram. Ou seja, criam seu
usurio. Isso feito todos os dias, para obter uma conta de
correio eletrnico, ou ativar uma rede social.
Nessa tela de cadastramento, precisam completar muitas
informaes; por exemplo, nome, sobrenome, data de
nascimento, telefone, endereo, pas, cidade, endereo de
correio eletrnico, etc. Cada um desses dados tem alguma
classe ou tipo. O que significa isso? A data de nascimento
tem a forma de uma data. O nome e o sobrenome so
palavras. O correio eletrnico tem o smbolo @ e um . ,
o nmero telefnico tem nmeros y, em alguns casos, -
ou parnteses.
Validao
Mas, o que acontece na realidade? Como o espao para
inserir dados nem sempre est programado corretamente,
o usurio poderia inserir dados de natureza errada em
nossa interface e, portanto, teramos informaes
incorretas, ou dados sujos. Assim, o usurio poderia dizer
que seu correio eletrnico , por exemplo, Joo da
Silva@ola. Ou que sua data de nascimento
milnovecentos.
Por esse motivo, feita o que chamamos validao de
dados. Isso , basicamente, corroborar que os dados
tenham o tipo e a forma adequados. Isso no significa que
o usurio no possa mentir, mas, no mnimo, garantimos
que os dados cumpram determinadas regras.
Validao no servidor
A validao pode ser feita enviando as informaes para o
servidor, para que ele as analise e, depois, o aplicativo
decida se elas tm o formato correto e as aprove, ou se
sero exibidas mensagens na interface com os erros
encontrados.
Podemos fazer isso utilizando novamente a estrutura de
meu modelo MVC, cuja viso requeira ao usurio inserir
informaes, para que, logo, o controlador envie essas
informaes para o modelo. Assim, o modelo decidir
como se atualizar a viso, levando em conta se os dados
inseridos so corretos ou no.
Como exemplo, vamos mostrar quais seriam os
componentes MVC para inserir um novo dado Pessoa, e
outra interface para poder consultar os dados.
Validao no servidor - Modelo
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace MvcSimpleModelBinding.Models
{
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public string Street { get; set; }
public string City { get; set; }
public string State { get; set; }
public int Zipcode { get; set; }
}
}
Validao no servidor - Controlador
public class PersonController : Controller
{
static List<Person> people = new List<Person>();
public ActionResult Index()
{
return View(people);
}
public ActionResult Details(Person person)
{
return View(person);
}
public ActionResult Create()
{
return View();
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(Person person)
{
if (!ModelState.IsValid)
{
return View("Create", person);
}
people.Add(person);
return RedirectToAction("Index");
}
}
Validao no servidor - Viso Index
<h2>Index</h2>
<table>
<tr>
<th></th>
<th>
Id
</th>
<th>
Name
</th>
</tr>
<% foreach (var person in Model) { %>
<tr>
<td><%= Html.ActionLink("Details", "Details", person )%></td>
<td><%= Html.Encode(person.Id) %></td>
<td><%= Html.Encode(person.Name) %></td>
</tr>
<% } %>
</table>
<p>
<%= Html.ActionLink("Create New", "Create") %>
</p>
Validao no servidor - Viso Create
<h2>Create</h2>
<%= Html.ValidationSummary("Create was unsuccessful. Please correct the errors and try again.") %>
<% using (Html.BeginForm()) {%>
<fieldset><legend>Fields</legend>
<p>
<label for="Id">Id:</label><%= Html.TextBox("Id") %><%= Html.ValidationMessage("Id", "*") %>
</p>
<p>
<label for="Name">Name:</label><%= Html.TextBox("Name") %><%= Html.ValidationMessage("Name", "*") %>
</p>
<p>
<label for="Age">Age:</label><%= Html.TextBox("Age") %><%= Html.ValidationMessage("Age", "*") %>
</p>
<p>
<label for="Street">Street:</label><%= Html.TextBox("Street") %><%= Html.ValidationMessage("Street", "*") %>
</p>
<p>
<label for="City">City:</label><%= Html.TextBox("City") %><%= Html.ValidationMessage("City", "*") %>
</p>
<p>
<label for="State">State:</label><%= Html.TextBox("State") %><%= Html.ValidationMessage("State", "*") %>
</p>
<p>
<label for="Zipcode">Zipcode:</label><%= Html.TextBox("Zipcode") %><%= Html.ValidationMessage("Zipcode", "*") %>
</p>
<p><input type="submit" value="Create" /> </p>
</fieldset>
<% } %>
<div><%=Html.ActionLink("Back to List", "Index") %></div>
Validao no servidor Viso Details
<h2>Details</h2>
<fieldset>
<legend>Fields</legend>
<p>
Id:<%= Html.Encode(Model.Id) %>
</p>
<p>
Name:<%= Html.Encode(Model.Name) %>
</p>
<p>
Age:<%= Html.Encode(Model.Age) %>
</p>
<p>
Street:<%= Html.Encode(Model.Street) %>
</p>
<p>
City:<%= Html.Encode(Model.City) %>
</p>
<p>
State:<%= Html.Encode(Model.State) %>
</p>
<p>
Zipcode:<%= Html.Encode(Model.Zipcode) %>
</p>
</fieldset>
<p><%=Html.ActionLink("Back to List", "Index") %></p>
<body>
<form name="myForm" action="demo_form.asp" onsubmit="return validateForm()" method="post">
First name: <input type="text" name="fname">
<input type="submit" value="Submit">
</form>
</body>
</html>
Validao no cliente - Javascript
Na funo anterior, o que fazemos ao enviar o formulrio chamar uma funo de Javascript
chamada validateForm, a qual controla se o contedo desse campo null ou vazio. Em caso
positivo, abrir um popup para informar o erro. A mesma coisa pode ser feita para validar um e-
mail:
<script>
function validateForm()
{
var x=document.forms["myForm"]["email"].value;
var atpos=x.indexOf("@");
var dotpos=x.lastIndexOf(".");
if (atpos<1 || dotpos<atpos+2 || dotpos+2>=x.length)
{
alert("Not a valid e-mail address");
return false;
}
}
</script>
Validao no cliente
Finalmente, existe outro tipo de validaes que
utiliza a tecnologia JQuery, a qual muito
simples. Alguns exemplos podem ser consultados
em: http://jqueryvalidation.org/