Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Treinamento
de
MVC
Samuel
Vaz
eu@resolvo.com.br
(11)
986
000
149
www.resolvo.com.br
1. Banco de dados
2. ADO.NET
J aprendemos que utilizar bancos de dados uma boa soluo
para o armazenamento dos dados. Entretanto, voc deve ter
percebido que a interface de utilizao do SQL Server (e dos outros
bancos de dados em geral) no muito amigvel. Ela exige que o
usurio conhea a sintaxe do SQL para escrever as consultas. Alm
disso, quando o volume de dados muito grande, mais difcil
visualizar os resultados.
Na prtica uma aplicao com interface simples desenvolvida para
permitir que os usurios do sistema possam manipular os dados do
banco de dados. De alguma forma, essa aplicao precisa se
comunicar com o banco de dados utilizado no sistema.
2.1 Driver
Como a aplicao precisa conversar com o banco de dados, ela
deve trocar mensagens com ele. O formato das mensagens precisa
ser definido previamente.
Para facilitar o desenvolvimento de aplicaes que devem se
comunicar com bancos de dados, as empresas que so proprietrias
desses bancos oferecem os drivers de conexo.
Os drivers de conexo atuam como tradutores de comandos
escritos em uma determinada linguagem de programao para
comandos no protocolo do banco de dados. Do ponto de vista do
desenvolvedor da aplicao, no necessrio conhecer o complexo
protocolo binrio do banco.
2.2 ODBC
Suponha que os proprietrios dos bancos de dados desenvolvessem
os drivers de maneira totalmente independente. Consequentemente,
cada driver teria sua prpria interface, ou seja, seu prprio conjunto
de instrues. Dessa maneira, o desenvolvedor da aplicao precisa
conhecer as instrues de cada um dos drivers dos respectivos
bancos que ele for utilizar.
Samuel
Vaz
eu@resolvo.com.br
Resolvo
Tecnologia
&
Solues
Para facilitar o trabalho do desenvolvedor da aplicao, a Microsoft
definiu uma especificao chamada ODBC (Open Database
Connectivity) para padronizar a interface dos drivers de conexo.
Assim, quando uma empresa proprietria de um banco de dados
pretende desenvolver um driver, ela segue essa especificao com o
intuito de populariz-lo.
Os drivers de conexo que respeitam a especificao ODBC, ou
seja, possuem um conjunto de comandos padronizados, so
chamados de drivers de conexo ODBC.
3. Entity
Framework
Entity Framework a ferramenta de Mapeamento Objeto-Relacional
(ORM) criada pela Microsoft e agora liberada dentro do modelo de
licena Open Source Apache 2.0 conforme divulgado no portal
CodePlex (http://entityframework.codeplex.com).
3.4 Configurao
Antes de comear a utilizar o Entity Framework, necessrio baixar
instalar atravs do pacote
3.6 Exerccios
- Crie um projeto novo.
- Crie um novo arquivo EDMX e faa o mapeamento da
estrutura das tabelas criadas
- Crie uma procedure chamada addEditora com o seguinte
cdigo:
CREATE
PROCEDURE
addEditoraProc
@NOME
varchar(200),
@EMAIL
varchar(200)
AS
INSERT
INTO
dbo.Editoras
(NOME,
EMAIL)
VALUES
(@NOME,
@EMAIL)
SELECT
*
FROM
dbo.Editoras
where
ID
=
@@IDENTITY
GO
3.7.1 Persistindo
Para armazenar as informaes de um objeto no banco de dados
basta utilizar o mtodo SAVECHANGES() do DBCONTEXT. As
entidades com o estado Added so inseridas no banco de dados
quando o mtodo SAVECHANGES() chamado.
3.7.2 Buscando
3.7.3 Removendo
As entidades com o estado Deleted so removidas do banco de
dados quando o mtodo SAVECHANGES() chamado. O mtodo
Remove remove a entidade do contexto e adiciona a entidade o
estado Deleted.
CursoDealEntities
db
=
new
CursoDealEntities();
db.DeleteObject((from
c
in
db.Editoras.Where(c=>
c.NOME
==
"Cadastro
do
entity")
select
c).First());
3.7.4 Atualizando
Para alterar os dados de um registro correspondente a um objeto
basta utilizar as propriedades dele. Quando as propriedades de uma
entidade do contexto alterada, o estado Modified adicionado a
esta entidade. Entidades com o estado Modified so atualizados no
banco de dados quando o mtodo SaveChanges chamado.
3.7.5 Listando
3.8 Exerccios
3.9 Repository
O Entity oferece recursos suficientes para que os objetos do domnio
sejam recuperados ou persistidos no banco de dados. Porm, em
aplicaes com alta complexidade e grande quantidade de cdigo,
espalhar as chamadas aos mtodos do DBCONTEXT e DBSET
pode gerar dificuldades na manuteno e no entendimento do
sistema.
Por padro, a url que deve ser utilizada para enviar uma requisio a
uma controller a concatenao da url principal da aplicao
seguido do nome da controller (ex: http: //localhost/Home).
Este cdigo:
4.8 Exerccios
@model
IEnumerable<Curso.Models.Editoras>
@{
ViewBag.Title
=
"Index";
}
<h2>Index</h2>
<p>
@Html.ActionLink("Create
New",
"Create")
</p>
<table>
<tr>
<th>
@Html.DisplayNameFor(model
=>
model.NOME)
</th>
<th>
@Html.DisplayNameFor(model
=>
model.EMAIL)
</th>
<th></th>
</tr>
@foreach
(var
item
in
Model)
{
<tr>
<td>
4.12 Exerccios
- Crie um mtodo para action Create na controller
EditorasController responsvel por apresentar um formulrio de
cadastramento de editoras. Este formulrio dever ser
acessado atravs de uma URL /Editoras/Create. Ao enviar os
dados do formulrio para o servidor atravs de uma requisio
POST, defina um mtodo para esta action que receba estes
dados enviados pelo usurio e salve na base de dados
utilizando a nossa classe Entity.
- Crie um mtodo para action Create na controller
LivrosController responsvel por apresentar um formulrio de
cadastramento de livros. Este formulrio dever ser acessado
atravs de uma URL /Livros/Create. Ao enviar os dados do
formulrio para o servidor atravs de uma requisio POST,
defina um mtodo para esta action que receba estes dados
enviados pelo usurio e salve na base de dados utilizando a
nossa classe Entity.
4.14 Exerccios
5. Tratamento de Erros
Inevitavelmente, as aplicaes esto sujeitas a erros de vrias
naturezas. Por exemplo, erros gerados pelo preenchimento incorreto
do campos de um formulrio. Esse tipo de erro causado por falhas
dos usurios. Nesse caso, importante mostrar mensagens
informativas com o intuito de fazer o prprio usurio corrigir os
valores preenchidos incorretamente.
Por outro lado, h erros que no so causados por falhas dos
usurios. Por exemplo, um erro de conexo com o banco de dados.
Nesses casos, improvvel que os usurios possam fazer algo que
resolva o problema. E mesmo que pudessem, provavelmente, no
seria conveniente esperar que eles o fizessem.
Quando um erro desse tipo ocorre, o ASP.NET cria uma pgina web
com informaes sobre o erro e a envia aos usurios. Para usurios
locais, o ASP.NET envia uma pgina web com informaes
detalhadas do erro ocorrido. Para usurios remotos, a pgina web
enviada no contm informaes detalhadas.
Em geral, no conveniente que os usurios recebam detalhes
tcnicos sobre os erros gerados por falhas da aplicao.
5.1 Try-Catch
5.1.1 Exerccios
5.1.3 Exerccios
Configure a aplicao para utilizar pginas de erro padro. Lembre-
se que no vamos mais precisar do comando try-catch colocado
anteriormente.
5.1.5 Exerccios
@{
int x = 123;
string nome = Samuel;
}
<div>@model.Nome</div>
@if (true) {
@model.Nome e um usuario
}
@* *@
@using(Html.BeginForm()) {
@using(Html.BeginForm("ACTION", "Controller")) {
Check Box:
Text Box:
<!--
Text
Box
Helper
-->
@Html.TextBox("meuTextbox",
"valor")
<!--
Sida:
-->
<input
id="meuTextbox"
name="meuTextbox"
type="text"
value="valor"
/>
Text Area:
<!--
Text
Area
Helper
-->
@Html.TextArea("meuTextarea",
"valor")
<!--
Sida:
-->
<textarea
cols="20"
id="meuTextarea"
name="meuTextarea"
rows="2">valor</textarea>
Radio Button:
<!--
Radio
Button
Helper
-->
@Html.RadioButton("meuRadiobutton",
"valor",
true)
<!--
Sida:
-->
<input
checked="checked"
id="meuRadiobutton"
name="meuRadiobutton"
type="radio"
value="
valor"
/>
Hidden Field:
Password Field:
<!--
Password
Field
Helper
-->
@Html.Password("meuPassword",
"valor")
<!--
Sida:
-->
<input
id="meuPassword"
name="meuPassword"
type="password"
value="valor"
/>
Check Box:
<!--
Check
Box
Helper
-->
@Html.CheckBoxFor(x
=>
x.IsAtivo)
Text Box:
<!--
Text
Box
Helper
-->
@Html.TextBoxFor(x
=>
x.Nome)
<!--
Sida:
-->
<input
id="Nome"
name="Nome"
type="text"
value="Valor
do
Nome"
/>
Text Area:
<!--
Text
Area
Helper
-->
@Html.TextAreaFor(x
=>
x.Descricao)
<!--
Sida:
-->
<textarea
cols="20"
id="Descricao"
name="Descricao"
rows="2">Valor
da
Descricao</textarea>
Radio Button:
<!--
Radio
Button
Helper
-->
@Html.RadioButtonFor(x
=>
x.IsAtivo,
"valor")
<!--
Sida:
-->
<input
checked="checked"
id="IsAtivo"
name="IsAtivo"
type="radio"
value="valor"
/>
Hidden Field:
Password Field:
<!--
Password
Field
Helper
-->
@Html.PasswordFor(x
=>
x.Password)
<!--
Sida:
-->
<input
id="Password"
name="Password"
type="password"/>
Isto equivalente a:
@Html.TextBox("Nome",
ViewData.Eval("Nome"))
Pelo fato do Helper HTML strongly typed Drop Down List no aceitar
tipos dinmicos, devemos fazer o cast para SelectList.
6.5 Exerccios
6.6.2 Lacunas
Tambm podemos criar lacunas na Master Page para serem
preenchidas com contedos definidos nas pginas. Segue a pgina
_Layout.cshtml:
<!DOCTYPE
html>
<html>
<head>
<meta
name="viewport"
content="width=device-width"
/>
<title>Curso
Deal
-
@ViewBag.Title</title>
</head>
<body>
<div>
<div
style="width:100%;float:left;"><h1>Biblioteca
do
Ensino</h1></div>
<div
style="width:auto;float:left;height:30px;"></div>
<div
style="width:100%;float:left;">
@RenderBody()
</div>
<div
style="width:100%;float:left;">
@RenderSection("rodape",required:false)
</div>
</div>
@System.Web.Optimization.Scripts.Render("~/bundles/jquery")
@RenderSection("scripts",
required:
false)
</body>
</html>
6.7 Exerccios
Crie uma pgina que servir de layout para a nossa aplicao
Altere a pgina Edit.cshtml de Editoras para utilizar a pgina de
layout definido no exerccio anterior.
Defina a pgina _Layout.cshtml como layout padro de cada
view.
Defina sees na pgina _Layout.cshtml.
Acrescente uma lacuna a pgina _Layout.cshtml.
Defina na pgina Edit.cshtml de Editoras a seo rodape
Acrescente uma seo padro as pginas que no definiram a
seo rodape.
6.9 Exerccios
Edite o arquivo Web.config da pasta Views para fazer as importaes
de bibliotecas automaticamente.
6.11 Exerccios
Crie uma partial view para o formulrio de Editora
7. Controles (Controller)
7.2 ActionResult
7.3 Parmetros
[HttpPost]
public
ActionResult
Salva(string
nome,
string
email)
{
Editora
editora
=
new
Editora
{
Nome
=
nome,
Email
=
email
};
return
View();
}
7.4 Exerccios
Adicione na controller Editoras uma action para visualizar o
formulrio de cadastro.
Crie uma pgina Create.cshtml de cadastro de editoras na
pasta Views/Editoras
Defina um mtodo para action HttpPost Create na controller
Editoras que ir receber os dados enviados pelo usurio e
adicionar uma editora ao banco de dados.
Altere o mtodo da action Salva para receber os dados como
parmetro e/ou objeto
7.5 TempData
Ao efetuar um redirecionamento, uma nova requisio efetuada
pelo browser. Nesta nova requisio no temos mais acesso aos
dados e objetos da requisio anterior ao redirecionamento. Caso
haja a necessidade de preservar os dados ao longo do
redirecionamento podemos utilizar o TempData.
7.6 Exerccios
Ao adicionar uma editora e redirecionar o usurio para a tela
de listagem, mostre uma mensagem ao usurio indicando que
a operao foi realizada com sucesso.
(opcional) Mostre mensagens para o usurio nas operaes de
atualizao e remoo de editoras.
A rota define um padro para URL e define como ela ser tratada.
9. Validao
9.2 View
As mensagens dos erros de validao podem ser acrescentadas na
pgina web atravs do mtodo ValidationSummary da propriedade
Html. importante salientar que esse mtodo adiciona todas as
mensagens de erro.
@using
(Html.BeginForm())
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
9.3 Exerccios
9.4 Anotaes
As lgicas de validao mais utilizadas tambm podem ser
implementadas atravs de anotaes adicionadas nas classes de
model. Dessa forma, essas lgicas no estariam mais nas
controllers, o que conceitualmente o ideal pois nas controllers s
deveria existir lgica para controlar o fluxo da execuo da aplicao.
9.4.1 Required
Uma das validaes mais comuns a de campo obrigatrio. Ela
pode ser realizada atravs da anotao Required.
[Required]
public
string
Nome
{
get;
set;
}
9.6 Exerccios
Altere as validaes feitas anteriormente, para utilizar
DataAnnotations.
Lembre-se de alterar todas as mensagens de erro para a
lngua portuguesa.
Acrescente tambm a validao no cliente.
10. Sesso
Quando um cliente for navegar na aplicao ele pode ter, por
exemplo, um carrinho de compras, que uma informao gerada
durante a navegao de um e-commerce. A medida que ele visita as
Views, ele pode adicionar ou remover itens do seu carrinho virtual.
Porm isto um problema, j que o protocolo HTTP no armazena
estado (stateless) das pginas visitadas anteriormente. Desse modo
no podemos armazenar a informao entre uma pgina e outra.
FormsAuthentication.SetAuthCookie(cliente.Usuario, false);
FormsAuthentication.SignOut();
11.2 Exerccios
Altere a aplicao do captulo anterior para incluir autenticao
nas Actions de adicionar, alterar e remover de editoras e livros.
Na Action de Login do ContaController, adicione o cookie de
autenticao como visto na seo anterior, passando o nome
de usuario como parmetro.
No layout principal, altere a seo que mostra o nome do
usurio, para utilizar a informao do cookie de autenticao, e
no mais da sesso.
Caso o usurio no esteja autenticado, e tente acessar uma
das Actions acima, redirecione atravs do Web.Config para a
Action de Login.
11.4 Exerccios
12.1 Modelo
Por onde comear o desenvolvimento de uma aplicao? Essa
uma questo recorrente. Um timo ponto de partida desenvolver as
entidades principais da aplicao. No nosso caso, vamos nos
restringir s entidades Usuario, Editoras e Livros. Devemos
estabelecer um relacionamento entre essas entidades j que uma
editora possui uma lista de livros.
12.2 Exerccios
12.6 Exerccios
Para cadastrar a editora, devemos definir a controller.
Vamos criar uma tela Create.cshtml para cadastrar as editoras.
Adicione o arquivo a pasta Views/Editoras com o seguinte contedo.
12.8 Exerccios
Acrescente uma coluna na tabela de listagem de editora.
Defina um mtodo Busca na classe Editora Repository que
retorna uma entidade editora a partir de um parmetro id.
12.12 Exerccios
Acrescente uma coluna na tabela de listagem de livros.
Defina um mtodo Busca na classe Livros Repository que
retorna uma entidade livro a partir de um parmetro id.
Defina uma action Delete que ir mostrar a tela de confirmao
de remoo da entidade.
Defina a tela de confirmao de remoo do livro.
Defina um mtodo na classe Livros Repository que remove
uma entidade jogador a partir de um parmetro id.
12.14 Exerccios
Adicione a seguinte classe a pasta Models:
12.15
Exerccios
12.16 Exerccios
12.18 Exerccios