Beruflich Dokumente
Kultur Dokumente
Se tudo correu conforme o esperado, seu projeto foi criado. Conforme mencionado
anteriormente, o que fizemos foi utilizar uma estrutura de aplicao j pronta e fornecida
pelo Visual Studio, portanto, ao compilar e executar o projeto, voc dever visualizar algo
semelhante ao apresentado pela Figura 4.
tudo correu bem, voc deve estar visualizando uma url semelhante a esta:
http://localhost:1379/. Como possvel notar, no temos a chamada explcita de
qualquer controller, action e value e mesmo assim nossa aplicao est funcionando
corretamente. Isto somente possvel em funo do cdigo implementado por padro
pela framework no arquivo Global.asax, conforme apresenta a Listagem 1.
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } //
Parameter defaults
);
}
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterRoutes(RouteTable.Routes);
}
Listagem 1: Definies padro de rotas da aplicao
Note que j esto definidos um controller padro, uma action padro e um value padro e
estes elementos j esto registrados na framework desta forma. Assim, teriamos a
exibio da mesma tela (view) se passssemos as seguintes urls na barra de endereos
do browser: http://localhost:1379/Home ou http://localhost:1379/Home/Index. Neste
caso, Home o controller e Index a action. A Figura 8 apresenta o resultado de
ambas as chamadas.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace SitePessoalMVC.Controllers
{
[HandleError]
public class HomeController : Controller
{
public ActionResult Index()
{
ViewData["Message"] = "Welcome to ASP.NET MVC!";
return View();
}
public ActionResult About()
{
return View();
}
}
}
Listagem 2: Actions do controller Home
Voc deve estar se perguntando: e as views? Onde entram nesta histria? Note, olhando
para o cdigo apresentado pela Listagem 2 fica fcil notar um aspecto: views no podem
ser resultantes de controllers. O motivo de realizar esta afirmao simples: como
possvel gerar uma nica tela para contedos diferentes? No possvel. Portanto, views
so telas que exibem contedos resultantes do processamento de actions e no de
controllers. Assim, em nosso exemplo, a action Index do controller Home exibe apenas
a mensagem Welcome to ASP.NET MVC.
Alguns aspectos so de fundamental importncia no cdigo da Listagem 2. O primeiro
deles que a action Index retorna um ActionResult, ou seja, a action deve retornar um
objeto especfico que a view reconhea e possibilite transitar valores entre os mdulos
(controllers e views). Neste caso, o que a action Index retorna um objeto ViewData
chamado Message que contm a mensagem Welcome to ASP.NET MVC. Views que
retornam ViewData so muito comuns nas aplicaes ASP.NET MVC, mas no so uma
regra. perfeitamente possvel, por exemplo, construir uma action que retorne uma string
etc. Veremos todos estes casos em nossos exemplos futuros.
Olhando novamente a Solution Explorer, desta vez o diretrio Views, fica fcil
encontrarmos um sub diretrio chamado Home e dentro dele dois arquivos com a
extenso ASPX: Index e About. Evidentemente que o sub diretrio possui o nome do
controller e os arquivos possuem os nomes das actions do mesmo, conforme pode ser
constatado na Listagem 2. Como estamos utilizando o exemplo do controller Home e da
action Index, a Listagem 3 apresenta o cdigo da view Index.
<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master"
Inherits="System.Web.Mvc.ViewPage" %>
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
Home Page
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<h2><%: ViewData["Message"] %></h2>
<p>
To learn more about ASP.NET MVC visit <a href="http://asp.net/mvc" title="ASP.NET
MVC Website">http://asp.net/mvc</a>.
</p>
</asp:Content>
Listagem 3: Cdigo da view Index
Como voc pode perceber, o cdigo da view extremamente simples. O aspecto a ser
ressaltado na Listagem 3 a utilizao das tags <% %> para escrevermos os valores
provenientes das actions, como pode ser constatado na linha 8. Aqui, o que estamos
fazendo escrever entre as tags <h2></h2> o ViewData retornado pela action.
Concluso
Aps a leitura deste segundo artigo, o que voc deve ter em mente : requisies so
tratadas pelos controllers atravs de actions, que geram views. A seleo da action
adequada por parte do controller depende diretamente da url invocada pelo usurio
atravs
do
browser,
que
segue
o
seguinte
formato:
http://dominio/controller/action/valor.
Outro aspecto que voc deve ter em mente que, um controller pode ter vrias actions,
tantas quantas necessrias e que, view so resultantes de actions e no de controllers.
Por enquanto, no estamos trabalhando com models, mas em um futuro prximo
trabalharemos e voc entender como realizado o acesso a dados.
Vdeo aula
Para reafirmar os conceitos apresentados neste artigo, recomendo fortemente a
visualizao da primeira vdeo aula da srie: ASP.NET MVC Incio, Meio e Fim Parte
2 Entendendo a estrutura de uma aplicao ASP.NET MVC. Bom aprendizado e no
deixe de enviar seus comentrios, eles so de fundamental importncia para ns.
.
Personalizando a aplicao
A aplicao que personalizaremos aqui aquela criada no segundo artigo da srie,
portanto, fundamental a leitura do segundo artigo para que possa prosseguir com os
exemplos apresentados a seguir.
Como mencionado tambm no artigo anterior, estamos utilizando para a construo de
nossos exemplos, um modelo de aplicao MVC j pronto, disponibilizado pelo Visual
Studio 2010. Este modelo j traz a estrutura de diretrios e arquivos base bem definida,
portanto, alguns aspectos devem ser personalizados, principalmente sob o aspecto
textual, para nos familiarizarmos com a aplicao. A seguir, apresento as pginas e
respectivas customizaes.
As personalizaes realizadas sero as seguintes:
Na guia Solution Explorer, expanda a aba no diretrio Views e, em seguida, expanda o
diretrio Shared. D um duplo clique sobre a pgina Site.Master. Nesta pgina,
atualizaremos:
1. A informao contida entre as tags h1;
2. Persolizaremos os tens de menu;
Como voc pde perceber, nossa aplicao utiliza o conceito de Master Pages, portanto,
as alteraes realizadas em Site.Master sero refletidas em todas as pginas que
herdam suas caractersticas. Caso este conceito seja novo para voc (conceito de Master
Pages), voc pode efetuar a leitura do artigo que escrevi aqui no site sobre o assunto. A
Listagem 1 apresenta o cdigo do trecho da pgina Site.Master antes da personalizao
e a Listagem 2 apresenta o cdigo depois da personalizao.
<div id="header">
<div id="title">
<h1>My MVC Application</h1>
</div>
<div id="logindisplay">
<% Html.RenderPartial("LogOnUserControl"); %>
</div>
<div id="menucontainer">
<ul id="menu">
<li><%: Html.ActionLink("Home", "Index", "Home")%></li>
<li><%: Html.ActionLink("About", "About", "Home")%></li>
</ul>
</div>
</div>
Listagem 1: Trecho de cdigo a ser personalizado
<div id="header">
<div id="title">
<h1>FabricioSanchez!</h1>
</div>
<div id="logindisplay">
<% Html.RenderPartial("LogOnUserControl"); %>
</div>
<div id="menucontainer">
<ul id="menu">
<li><%: Html.ActionLink("Home", "Index", "Home")%></li>
<li><%: Html.ActionLink("Usurios", "Index", "Usuarios")%></li>
<li><%: Html.ActionLink("Notcias", "Index", "Noticias")%></li>
</ul>
</div>
</div>
Listagem 2: Trecho de cdigo personalizado
Em relao aos cdigos apresentados pelas Listagens 1 e 2, os aspectos a serem
observados so:
Listagem 2 linha 3: O contedo foi modificado, de My MVC Application para
FabricioSanchez!;
Listagem 2 linhas 13-15: Alterados os tens de menu. Duas novas opes foram
adicionadas as tags <li>, Usurios e Notcias.
Uma observao importante sobre a criao dos novos tens de menu a ausncia das
tags <a></a> para vinculao dos links. Estas tags encontram-se ausentes em funo
da utilizao do helper Html. Falaremos especificamente dos helpers em um artigo
futuro desta srie, mas apenas para fins de contextualizao, o que um helper faz
encapsular uma operao especifica para simplificar o processo de escrita da view.
Assim, o helper Html atravs da funo ActionLink redireciona a requisio para o
controller e action respectiva. A Figura 1 apresenta a aplicao em execuo aps as
alteraes realizadas.
//
// GET: /Usuarios/Details/5
public ActionResult Details(int id)
{
return View();
}
//
// GET: /Usuarios/Create
public ActionResult Create()
{
return View();
}
//
// POST: /Usuarios/Create
[HttpPost]
public ActionResult Create(FormCollection collection)
{
try
{
// TODO: Add insert logic here
return RedirectToAction("Index");
}
catch
{
return View();
}
}
//
// GET: /Usuarios/Edit/5
public ActionResult Edit(int id)
{
return View();
}
//
// POST: /Usuarios/Edit/5
[HttpPost]
public ActionResult Edit(int id, FormCollection collection)
{
try
{
// TODO: Add update logic here
return RedirectToAction("Index");
}
catch
{
return View();
}
}
//
// GET: /Usuarios/Delete/5
public ActionResult Delete(int id)
{
return View();
}
//
// POST: /Usuarios/Delete/5
[HttpPost]
public ActionResult Delete(int id, FormCollection collection)
{
try
{
// TODO: Add delete logic here
return RedirectToAction("Index");
}
catch
{
return View();
}
}
}
}
Listagem 4: ControllerUsuarios e suas actions
Muito bem, o que fizemos aqui foi adicionar um novo controller a nossa aplicao
ASP.NET MVC. Este controller foi nomeado como Usuarios e possui (de incio) 8
actions. So elas:
Index(): Action executada por padro quando o controller chamado. Neste artigo,
iremos realizar operaes apenas nesta action. Nos artigos futuros
implementaremos as demais actions.
Details(): Esta action ser executada quando uma operao de details for solicitada
atravs da view. Evidentemente que a lgica de exibio da action deve ser
implementada pelo desenvolvedor. O que a framework faz apenas criar a
estrutura para que o programador personalize.
Create() e [HttpPost] Create(): Note que existem duas actions Create. A primeira
no possui o atributo [HttpPost], portanto, esta a responsvel por exibir o
formulrio de cadastro dos dados do usurio. Sua funo unicamente gerar a
view de cadastro para o usurio. J a segunda, acompanha o atributo [HttpPost],
portanto, se a primeira exibe a tela de cadastro de usurio, a segunda envia os
selecionar a opo Add new item uma janela de opes ser exibida. A esquerda
selecione a guia Data e, a direita, selecione a opo ADO.NET Entity Data Model.
Nomeie este arquivo conforme a convenincia. Sugestivamente nomeamos como
ModeloSitePessoalMVC.edmx. A Figura 4 ilustra este procedimento.
ORM a forma como estas manipulaes se daro no banco de dados. Note que todas as
caractersticas do banco de dados foram mantidas no modelo conceitual: relacionamento,
chaves primrias, tipos de dados, etc.
Inserindo novos usurios
Com nosso modelo de dados j pronto, podemos ento codificar nossas actions para que
elas insiram, editem, removam e listem usurios. A primeira destas tarefas consiste na
insero de novos usurios, assim, d um duplo clique sobre o controller
UsuariosController (criado no terceiro artigo desta srie). Procure a action Create. Note
que existem duas actions Create. Uma delas possui o atributo [HttpPost]. Basicamente,
a action que possui o o atributo em seu cabealho aquela invocada no moment0 em que
solicitamos o postback com os dados fornecidos pelo usurio no formulrio de cadastro. A
action que no possui este atributo, aquela invocada por default pela framework MVC
atravs do URL routing: http://seu-endereco/Usuarios/Create. Primeiramente iremos criar
o formulrio para o cadastro dos dados de usurio, portanto, v at a action Create (sem
HttpPost) e em seu interior adicione o cdigo apresentado pela Listagem 1.
public ActionResult Create()
{
return View(new tbUsuarios());
}
Listagem 1: Retornando os dados da classe tbUsuarios para view
Como possvel notar, o cdigo apresentado pela action Create extramente simples. A
nica responsabilidade desta action retornar os dados constantes da classe
tbUsuarios, assim, quando criarmos nossa view fortemente tipada, a framework saber
como realizar o binding das informaes. Agora que j possumos a codificao de nossa
action, podemos criar nossa view que conter o formulrio. Para isso, clique com o boto
direito do mouse sobre sobre o nome da action (neste caso Create) e selecione a opo
Add view. Na janela que se abre, voc pode parametrizar views. Alguns parmetros
possveis de serem personalizados:
Fortemente ou fracamente acoplada: possvel amarrar a construo da view ao
modelo de dados. Para isso, basta ticar a opo Create a strongly-typed view. No
caso da associao, dizemos que a view fortemente tipada, caso contrrio,
dizemos que a view fracamente acoplada.
View Content: possvel utilizar templates em associao com helpers para
construir views. As operaes bsicas de CRUD possuem modelos prontos que
so disponibilizados pela framework. Ao selecionar um formato de view content o
que estar fazendo na realidade escolhendo um template para construo da
view.
Master Page: possvel criar views que herder padres visuais atravs de Master
Pages. Para isso, basta selecionar a opo Select master page e indicar o
caminho fsico da mesma.
Partial View: possvel ainda criar views parciais, ou seja, views com as extenses
.ascx (semelhantes aos web user controls) do ASP.NET Web Forms. Estas
carregam contedos especficos em regies diferentes de uma mesma view.
A Figura 9 apresenta a configurao final da view Create. Uma observao importante a
ser realizada aqui que, views no necessariamente precisam possuir o mesmo nome
das actions. Muito embora seja uma prtica recomendvel, isto no uma regra.
objeto que chegou para a action, simplificando, o EF4 est adicionando cada uma
das propriedades de objUsuario em cada coluna da tabela tbUsuarios. Como?
Isso no problema nosso.
Linha 7: Atualizamos o modelo e a sim, a gravao realizada na base de dados.
importante
salientar
que,
modelo
uma
instncia
da
classe
StringConexaoExemploMVC, ou seja, da classe de contexto que definimos quando
criamos nosso modelo conceitual com o Entity Framework. Esta instanciao, neste caso,
ocorre na primeira linha do controller UsuariosController, como pode ser visto abaixo.
StringConexaoExemploMVC modelo = new StringConexaoExemploMVC();
Como uma classe que herda de ObjectContext ela implementa os mtodos inerentes
a cada uma das entidades do modelo conceitual.
A Figura 11 apresenta o sucesso da insero de um novo usurio.
select u;
return View(usuarios.ToList());
}
Listagem 4: Listando os usurios cadastrados
notria a simplicidade do cdigo apresentado pela Listagem 4. O que fazemos aqui
retornar todos os dados presentes em tbUsuarios com LINQ e armazenar no objeto
usuarios. Em seguida, atravs do mtodo ToList() retornamos uma lista de valores para
a view. Clicando com o boto direito sobre o nome da action e selecionando Add view
obtemos o resultado apresentado na Figura 12. A nica mudana em relao a gerao
da view Create est no tipo de template utilizado para gerao da mesma. Como
estamos listando registros, evidentmente que o template utilizado foi List.
{
var usuarioSel = from us in modelo.tbUsuarios
where us.IDUsuario == id
select us;
UpdateModel(usuarioSel.SingleOrDefault());
modelo.SaveChanges();
return RedirectToAction("Index");
}
catch
{
return View();
}
}
Listagem 6: Atualizando dados do usurio selecionado
Na Listagem 6, novamente o que fazemos selecionar o usurio e passar seus dados
(atravs de id e de FormCollection) para o mtodo UpdateModel() para que a
atualizao seja realizada de fato na base de dados novamente pelo mtodo
SaveChanges() do modelo. O resultado final da edio dos dados do usurio pode ser
visualizado na Figura 13.
where ud.IDUsuario == id
select ud;
return View(usuarioDel.SingleOrDefault());
}
Listagem 7: Selecionando o registro para remoo
Sim eu sei, parece que est tudo ficando repetitivo. Mas que a simplicidade do processo
muito grande. Note, novamente, selecionamos o registro a ser removido (atravs de seu
ID via LINQ) assim como fizemos para editar e retornamos os dados para view.
Novamente, ao adicionar a view e selecionarmos o template Delete temos a exibio
conforme apresenta a Figura 14.
usurio em um formulrio qualquer de pgina web construdo sob o padro MVC. Para a
construo dos exemplos deste artigo, utilizaremos a mesma aplicao mencionada nos
outros artigos da srie, especialmente os exemplos apresentados no artigo anterior a
este.
Validando dados com Data Annotations
Data Annotations um recurso disponvel na framework de forma nativa a partir da verso
2. Muito embora seja nativa a partir da verso 2 do ASP.NET MVC, possvel trabalhar
com Data Annotations em verses anteriores, bastando para isso, efetuar o download e a
instalao do Data Annotations Model Binder. Se este seu caso, baixe o pacote no
Codeplex clicando aqui.
Mas voc deve estar se perguntando: O que faz este Data Annotations? Basicamente,
esta tcnica consiste na decorao de propriedades de uma classe com alguns atributos
especficos, sendo que estes podem ser parametrizados. Assim, na execuo do
postback, ao controller invocar a action especfica para a operao, os valores para
associados a cada propriedade so confrontados (de acordo com os parmetros
informados para os atributos). Caso satisfaam os parmetros, libera o envio, caso
contrrio, no libera.
Para demonstrar este conceito, iremos utilizar o cadastro de novos usurios,
apresentado no artigo 4 desta srie. Assim, com o Visual Studio aberto, v at a Solution
Explorer do projeto e d um duplo clique sobre o arquivo Create.aspx localizado em
~/Views/Usuarios/. Executando este arquivo, ser fcil notar que o formulrio de
cadastro de novos usurios aceita o cadastro de campos em branco, e-mails invlidos,
etc. Portanto, o que faremos realizar a validao destas informaes antes do envio ao
banco de dados via Data Annotations.
Na pasta Models de seu projeto, clique com o boto direito do mouse e selecione a
opo Add class. Neste arquivo, substitua o cdigo gerado pelo cdigo apresentado
pela Listagem 1.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations;
using System.Web.Mvc;
namespace SitePessoalMVC.Models
{
[MetadataType(typeof(UsuariosMetadata))]
public partial class tbUsuarios
{
}
[Bind(Exclude="IDUsuario")]
public class UsuariosMetadata
{
[Required(ErrorMessage="Por favor, informe seu nome.")]
public string NomeCompleto { get; set; }
[Required(ErrorMessage="Por favor, informe o username.")]
public string Username { get; set; }
}
Listagem 2: Validando o modelo de dados no postback
O que fazemos acima, conforme mencionado anteriormente, consiste na validao do
modelo de dados antes do envio das informaes. Assim, importante observar primeiro
a linha 4, onde encontramos TryUpdateModel(modelo). Aqui, como o prprio nome do
mtodo sugere, estamos tentando validar o modelo de dados. Em seguida, verificamos
atravs de um if se o modelo valido e, em caso afirmativo, enviamos os dados, como
pode ser visto nas linhas 6, 8, 9 e 10.
Ao finalizar este processo e executar sua aplicao, se tudo correu bem, voc dever
estar visualizando a tela semelhante a Figura 1.
<fieldset>
<legend>Fields</legend>
<div class="editor-label">
<%: Html.LabelFor(model => model.NomeCompleto) %>
</div>
<div class="editor-field">
<%: Html.TextBoxFor(model => model.NomeCompleto) %>
<%: Html.ValidationMessageFor(model => model.NomeCompleto) %>
</div>
<div class="editor-label">
<%: Html.LabelFor(model => model.Username) %>
</div>
<div class="editor-field">
<%: Html.TextBoxFor(model => model.Username) %>
<%: Html.ValidationMessageFor(model => model.Username) %>
</div>
<div class="editor-label">
<%: Html.LabelFor(model => model.Password) %>
</div>
<div class="editor-field">
<%: Html.TextBoxFor(model => model.Password) %>
<%: Html.ValidationMessageFor(model => model.Password) %>
</div>
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
<% } %>
<div>
<%: Html.ActionLink("Back to List", "Index") %>
</div>
</asp:Content>
Listagem 2: View do formulrio de cadastro
O segredo est nas linhas 22, 30 e 38.Como possvel notar, os dados so exibidos
atravs do helper Html atravs do mtodo ValidationMessageFor( model =>
model.Propriedade ). O helper est ligado diretamente ao modelo. Como estamos
manipulando diretamente as propriedades da classe me (do modelo), ao os decorarmos
com os atributos de Data Annotations as mudanas so refletidas no mtodo
ValidationMessageFor atravs da expresso lambda.
Por hoje era isso pessoal. Por favor, ao finalizar a leitura deste artigo, deixe seu
comentrio. No demora 1 minuto e de fundamental importncia para que possamos
melhorar a qualidade dos textos. No prximo artigo aprenderemos a trabalhar com rotas
personalizadas. No percam! At l!
"BlogRoute",
"/Arquivo/{DataEntrada}",
new { Controller = "Arquivo", Action = "Entrada" }
);
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter
defaults
);
}
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterRoutes(RouteTable.Routes);
}
}
}
Listagem 4: Cdigo final do arquivo Global.asax
Uma observao importante a ordem de insero da nova instncia. Note, temos
primeiro a nova rota (BlogRoute) e depois a rota padro (Default). Isso indica a framework
que a rota a ser considerada primeiro BlogRoute e no Default. Vamos agora criar o
controller Arquivo, responsvel por retornar o post da data de entrada. Para isto, clique
com o boto direito do mouse sobre a pasta Controllers, em seguida Add e Controller.
Nomeie-o como ArquivoController e pressione OK. Em seguida, substitua o contedo
do controller recm criado por aquele apresentado pela Listagem 5.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace RotasPersonalizadasBlog.Controllers
{
public class ArquivoController : Controller
{
//
// GET: /Arquivo/
public ActionResult Entrada(DateTime DataEntrada)
{
ViewData["Mensagem"] = "A data de entrada foi: " + DataEntrada.ToString();
return View();
}
}
}