ASP
.NET MVC - Usando Autenticação, imagens, Repositório, Unit of
Work e Entity Framework (C#) - II
Na primeira parte deste artigo criamos o projeto e definimos as referências necessárias; também definimos o Model , aplicamos o padrão repositório e o padrão unit of work preparando assim toda a infraestrutura da nossa aplicação.
Vamos agora definir os nosso controladores que por tabela irão definir quais as views teremos que criar para atuar como interface com o usuário.
Definindo os Controladores
O primeiro controller que iremos definir na verdade ja foi criado quando criamos o projeto e escolhemos o template ASP .NET MVC 3 Web Application: o HomeController.cs.
Abra este arquivo e altere o seu conteúdo conforme abaixo:
| using System.Web.Mvc; namespace Repositorio_EF.Controllers { public class HomeController : Controller { public ActionResult Index() { ViewBag.Message = "Bem-Vindo a Escola Macoratti"; return View(); } // public ActionResult About() { return View(); } public ImageResult GetImage() { return new ImageResult("c:\\dados\\Imagens\\ponte.jpg"); } } } |
Outro arquivo que vamos alterar é o arquivo _Layout.cshtml que esta na pasta Views -> Shared. Embora ele não seja um controlador temos que definir os itens que desejamos exibir no menu da aplicação. Abra então este arquivo e altere o seu conteúdo conforme abaixo:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>@ViewBag.Title</title>
<link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" type="text/css" />
<script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/modernizr-1.7.min.js")" type="text/javascript"></script>
</head>
<body>
<div class="page">
<header>
<div id="title">
<h1>Macoratti .net</h1>
</div>
<div id="logindisplay">
@Html.Partial("_LogOnPartial")
</div>
<nav>
<ul id="menu">
<li>@Html.ActionLink("Home", "Index", "Home")</li>
<li>@Html.ActionLink("Sobre", "About", "Home")</li>
<li>@Html.ActionLink("Cursos", "Index", "Cursos")</li>
<li>@Html.ActionLink("Alunos", "Index", "Alunos")</li>
</ul>
</nav>
</header>
<section id="main">
@RenderBody()
</section>
<footer>
</footer>
</div>
</body>
</html>
|
Além disso para podermos exibir a página inicial tenha certeza de que a view Index.cshtml tenha o seguinte conteúdo:
Obs: Note que estamos usando a Action Getimage definida no controller HomeController.cs da classe ImageResult.cs definida em nosso Model:
| @{ ViewBag.Title = "Home Page"; } <h2>@ViewBag.Message</h2> <p> <h2> Gerencie Cursos e Alunos - Com ASP .NET MVC </h2> <p><img src="/Home/GetImage" alt="logo"/></p> </p> |
Após estas alterações executando a aplicação iremos obter a seguinte página:
![]() |
Definindo o controlador para os Cursos
Clique com o botão direito do mouse sobre a pasta Controllers e selecione Add -> Controller e a seguir informe o nome CursosController na janela Add Controller:
![]() |
Após clicar no botão Add o arquivo CursosController será criado na pasta Controllers; altere então seu conteúdo para estar conforme o código a seguir:
using System.Web.Mvc;
using Repositorio_EF.Models;
namespace Repositorio_EF.Controllers
{
[Authorize(Roles = "Administrador")]
public class CursosController : Controller
{
private UnitOfWork unitOfWork = new UnitOfWork();
//
public ActionResult Index()
{
return View(unitOfWork.CursoRepositorio.Cursos);
}
//
public ActionResult Create()
{
return View();
}
//
public ActionResult Delete(int id)
{
Curso curso = unitOfWork.CursoRepositorio.Busca(id);
return View(curso);
}
//
[HttpPost]
[ActionName("Delete")]
public ActionResult DeleteConfirmed(int id)
{
unitOfWork.CursoRepositorio.Remove(id);
unitOfWork.Salva();
return RedirectToAction("Index");
}
//
protected override void Dispose(bool disposing)
{
unitOfWork.Dispose();
base.Dispose(disposing);
}
//
[HttpPost]
public ActionResult Create(Curso curso)
{
if (ModelState.IsValid)
{
unitOfWork.CursoRepositorio.Adiciona(curso);
unitOfWork.Salva();
return RedirectToAction("Index");
}
return View(curso);
}
}
}
|
Note que estamos usando um
filtro de autorização na classe CursosController: [Authorize(Roles = "Administrador")] Dessa forma o acesso à
classe somente poderá ser feita por usuário autenticado
Estamos usando o padrão Unit of Work definido para realizar a persistência das |
Após criar o controlador clique com o botão direito do mouse sobre o seu interior e selecione Add View e a seguir na janela Add View selecione o Model Curso e o respectivo Scaffold template. Assim você deve clicar no interior do controlador no método Index e selecionar List, para o método Create e selecionar Create , no interior do método Delete e selecionar Delete, etc.
Dessa forma serão criadas as views Index.cshtml, Create.cshtml e Delete.cshtml na pasta Views->Cursos;
![]() |
Vamos repetir o procedimento feito acima para criar o controlador para os Alunos de forma que o arquivo AlunosController.cs deverá ser criado com o seguinte conteúdo:
using System.Web.Mvc;
using Repositorio_EF.Models;
namespace Repositorio_EF.Controllers
{
[Authorize(Roles = "Administrador")]
public class AlunosController : Controller
{
// GET: /Alunos/
public ActionResult Index()
{
return View(unitOfWork.AlunoRepositorio.Alunos);
}
//
private UnitOfWork unitOfWork = new UnitOfWork();
public ActionResult Create()
{
ViewBag.CursoId = new SelectList(unitOfWork.CursoRepositorio.Cursos, "CursoId", "Descricao");
return View();
}
//
[HttpPost]
public ActionResult Create(Aluno aluno)
{
if (ModelState.IsValid)
{
unitOfWork.AlunoRepositorio.Adiciona(aluno);
unitOfWork.Salva();
}
ViewBag.CursoId = new SelectList(unitOfWork.CursoRepositorio.Cursos, "CursoId", "Descricao");
return View();
}
//
public ActionResult Delete(int id)
{
Aluno aluno = unitOfWork.AlunoRepositorio.Busca(id);
return View(aluno);
}
//
[HttpPost]
[ActionName("Delete")]
public ActionResult DeleteConfirmed(int id)
{
unitOfWork.AlunoRepositorio.Remove(id);
unitOfWork.Salva();
return RedirectToAction("Index");
}
//
protected override void Dispose(bool disposing)
{
unitOfWork.Dispose();
base.Dispose(disposing);
}
}
}
|
Note que estamos usando um
filtro de autorização na classe CursosController: [Authorize(Roles = "Administrador")] Dessa forma o acesso à
classe somente poderá ser feita por usuário autenticado
Estamos usando o padrão
Unit of Work definido para realizar a persistência das |
Após criar o controlador clique com o botão direito do mouse sobre o seu interior e selecione Add View e a seguir na janela Add View selecione o Model Aluno e o respectivo Scaffold template. Assim você deve clicar no interior do controlador no método Index e selecionar List, para o método Create e selecionar Create , no interior do método Delete e selecionar Delete, etc.
Dessa forma serão criadas as views Index.cshtml, Create.cshtml e Delete.cshtml na pasta Views->Alunos;
![]() |
Agora com base no controlador AccountController que foi criado por padrão quando da criação do projeto vamos criar um novo controlador chamado UsuarioController.cs que deverá ter o seguinte código:
using System;
using System.Web.Mvc;
using System.Web.Security;
using Repositorio_EF.Models;
namespace Repositorio_EF.Controllers
{
public class UsuarioController : Controller
{
//
// GET: /Usuario/
public ActionResult Index()
{
return View();
}
//
public ActionResult LogOn()
{
return View();
}
//
[HttpPost]
public ActionResult LogOn(LogOnModel model, string returnUrl)
{
if (ModelState.IsValid)
{
if (Membership.ValidateUser(model.UserName, model.Password))
{
FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
&& !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
{
return Redirect(returnUrl);
}
else
{
return RedirectToAction("Index", "Home");
}
}
else
{
ModelState.AddModelError("", "O usuário e/ou a senha está incorreto.");
}
}
return View(model);
}
// GET: /Usuario/LogOff
public ActionResult LogOff()
{
FormsAuthentication.SignOut();
return Redirect("/");
}
//
public ActionResult Register()
{
return View();
}
//
// POST: /Usuario/Register
[HttpPost]
public ActionResult Register(RegisterModel model)
{
if (ModelState.IsValid)
{
// Attempt to register the user
MembershipCreateStatus createStatus;
Membership.CreateUser(model.UserName, model.Password, model.Email,null, null, true, null, out createStatus);
if (createStatus == MembershipCreateStatus.Success)
{
FormsAuthentication.SetAuthCookie(model.UserName, false /*-createPersistentCookie */);
return Redirect("/");
}
else
{
ModelState.AddModelError("", ErrorCodeToString(createStatus));
}
}
return View(model);
}
//
// GET: /Usuario/ChangePassword
[Authorize]
public ActionResult ChangePassword()
{
return View();
}
//
// POST: /Usuario/ChangePassword
[Authorize]
[HttpPost]
public ActionResult ChangePassword(ChangePasswordModel model)
{
if (ModelState.IsValid)
{
bool changePasswordSucceeded;
try
{
MembershipUser currentUser = Membership.GetUser(User.Identity.Name, true /* userIsOnline */);
changePasswordSucceeded = currentUser.ChangePassword(model.OldPassword, model.NewPassword);
}
catch (Exception)
{
changePasswordSucceeded = false;
}
if (changePasswordSucceeded)
{
return RedirectToAction("ChangePasswordSuccess");
}
else
{
ModelState.AddModelError("", "A senha atual ou a confirmação está incorreta.");
}
}
return View(model);
}
//
// GET: /Usuario/ChangePasswordSuccess
public ActionResult ChangePasswordSuccess()
{
return View();
}
private static string ErrorCodeToString(MembershipCreateStatus createStatus)
{
// See http://go.microsoft.com/fwlink/?LinkID=177550 for
// a full list of status codes.
switch (createStatus)
{
case MembershipCreateStatus.DuplicateUserName:
return "Este nome de usuário já existe. Defina outro usuário.";
case MembershipCreateStatus.DuplicateEmail:
return "Este email já foi cadastrado. Defina outro email.";
case MembershipCreateStatus.InvalidPassword:
return "Senha incorreta.";
case MembershipCreateStatus.InvalidEmail:
return "Email inválido.";
case MembershipCreateStatus.InvalidAnswer:
return "Resposta inválida para recuperar a senha.";
case MembershipCreateStatus.InvalidQuestion:
return "Questão inválida para recuperar a senha.";
case MembershipCreateStatus.InvalidUserName:
return "Usuário inválido.";
case MembershipCreateStatus.ProviderError:
return "Ocorreu um erro durante a autenticação. Se o problema persistir, contate o administrador.";
case MembershipCreateStatus.UserRejected:
return "O cadastro do usuário foi cancelado. Se o problema persistir, contate o administrador.";
default:
return "Um erro inesperado ocorreu. Se o problema persistir, contate o administrador.";
}
}
public ImageResult GetImage()
{
return new ImageResult("c:\\dados\\Imagens\\chgpass.jpg");
}
}
}
|
Este controlador irá permitir a autenticação do usuário para ter acesso às páginas dos Cursos e Alunos.
A partir deste controlador iremos criar as views LogOn.chstml, Register.cshtml, ChangePassword.cshtml e ChangePasswordSuccess.cshtml na pasta Views->Usuario;
Incluindo um usuário Admininistrador com ASP .NET Configuration
Vamos agora definir um usuário com perfil de administrador usando a ferramenta ASP .NET Configuration;
Para ativar a ferramenta clique no ícone indicado na figura na janela Solution Explorer:
![]() |
Será aberta a página abaixo no seu navegador padrão; Clique no link Security;
![]() |
Na próxima página clique no link - Create or Manage roles;
![]() |
Informe o nome perfil informando administrador Add Role para adicionar o novo perfil criado;
![]() |
Clique no botão Back e a seguir clique em Create User e informe o nome, senha e email e marque o perfil do usuário como administrador:
![]() |
Pronto com isso já temos um usuário com perfil de administrador que poderá acessar as páginas para Cursos e Alunos;
Definindo um controlador para tratamento de erros
Clique na pasta Controllers com o botão direito do mouse e selecione Add->Controller informando o nome ErroControler e a seguir digite o código abaixo neste arquivo:
using System.Web.Mvc;
namespace Repositorio_EF.Controllers
{
public class ErroController : Controller
{
//
// GET: /Erro/
public ActionResult Desconhecido()
{
return View();
}
//
// GET: /Erro/PaginaNaoEncontrada
public ActionResult PaginaNaoEncontrada()
{
return View();
}
}
}
|
| ErroController.cs |
No código acima definimos duas Actions para tratar erros desconhecidos e uma Action para página não encontrada.
Agora vamos criar uma view para cada Action clicando sobre o código do método Action correspondente e selecionando Add View;
Repita o procedimento para o método Action PaginaNaoEncontrada e a seguir defina o código para cada view conforme abaixo:
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<title> no servidor</title>
</head>
<body>
<h2>Desculpe, Sua solicitação não pode ser atendida. Volte dentro de alguns instantes. -
</h2>
<p>Entre em contato com o suporte. Envie uma mensagem para os administradores do sistema.</p>
@using (Html.BeginForm("Envia", "Email"))
{
<div class="editor-label">
@Html.Label("Mensagem")
</div>
<div class="editor-field">
@Html.TextArea("Mensagem")
</div>
<input type="submit" value="Enviar" />
}
</body>
</html>
|
<!--
~/Views/Erro/PaginaNaoEncontrada.cshtml --> @{ Layout = null; } <!DOCTYPE html> <html> <head> <title>Página não encontrada</title> </head> <body> <h2>Página não encontrada</h2> </body> </html> |
| /Views/Erro/Desconhecido.cshtml | /Views/Erro/PaginaNaoEncontrada.cshtml |
Vamos agora definir um controlador para enviar Email
Clique na pasta Controllers com o botão direito do mouse e selecione Add->Controller informando o nome EmailControler e a seguir digite o código abaixo neste arquivo:
using System.Web.Mvc;
using System.Web.Helpers;
namespace Repositorio_EF.Controllers
{
public class EmailController : Controller
{
public EmailController()
{
WebMail.SmtpServer = "smtp.gmail.com";
WebMail.EnableSsl = true;
WebMail.SmtpPort = 587;
WebMail.From = "USUARIO@gmail.com";
WebMail.UserName = "USUARIO@gmail.com";
WebMail.Password = "SENHA";
}
//
// POST: /Email/Envia
[HttpPost]
public ActionResult Envia(string mensagem)
{
WebMail.Send("EMAIL", "Alunos - Erro", mensagem);
return View();
}
}
}
|
| EmailController.cs |
Agora vamos criar uma view para a Action Envia clicando sobre o código do método Action correspondente e selecionando Add View;
A seguir digite o código abaixo para esta view:
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<title>Envia</title>
</head>
<body>
<div>
Mensagem enviada com sucesso.
</div>
<div>
@Html.ActionLink("Voltar para página inicial", "Index", "Selecoes")
</div>
</body>
</html>
|
| Views/Email/Envia.cshtml |
O arquivo Envia.cshtml será criado na pasta Email.
Neste ponto já podemos executar a aplicação e clicar na aba Cursos e Alunos e neste caso iremos obter o formulário para autenticação;
![]() |
Após fazer a autenticação será a apresentada a página cadastrar Cursos e/ou Alunos conforme abaixo:
![]() |
![]() |
Note que como foi a primeira execução o banco de dados e as tabelas foram criados e estão vazios.
Em cada página temos um link para cadastrar um novo curso e criar um novo Aluno;
Primeiro devemos cadastrar um novo curso:
![]() |
|
![]() |
Em seguida criar um novo Aluno:
![]() |
|
![]() |
E assim temos nossa aplicação ASP .NET MVC funcional usando alguns recursos básicos de uma aplicação web.
O projeto serve para estudo e também pode ser melhorado e expandido com por exemplo : a criação de página para avaliação ou uma página de notas.
Pegue o projeto completo
aqui:
Repositorio_EF.zip
Rom 8:34
Quem os condenará? Cristo Jesus é quem morreu, ou antes quem ressurgiu dentre os mortos, o qual está à direita de Deus, e também intercede por nós;Referências: