Académique Documents
Professionnel Documents
Culture Documents
AngularJs e
Web API
Sumrio
ASPNET, AngularJs e Web API.........................................................................3
Criando a aplicao ASP.NET..........................................................................3
Adicionar uma conexo um Banco de Dados..............................................4
Pacotes utilizados........................................................................................... 5
Modelo de Dados usando Entity Data Model..................................................6
Criando o Web API Controller para o CRUD..................................................7
Mtodos do protocolo [Http].....................................................................10
Module, Service e Controller........................................................................10
Definindo a inicializao do AngularJs Module........................................10
Criando o servio para mapeamento do Banco Service.........................11
Criando o Controller.................................................................................. 12
Referenciando os elementos (arquivos scripts e css) na aplicao..............15
Arquivo Index............................................................................................... 15
Arquivo _Layout............................................................................................ 16
Validando o formulrio................................................................................. 18
5
Selecione no Server Explorer uma nova conexo e preencha os dados de
acordo com a configurao de seu Server Name do SQL Server e selecione
o Banco de Dados criado para a aplicao:
Pacotes utilizados
No Solucion Explorer no Item References, clique com o boto direito do
mouse e selecione Manege NuGet Package
Instale os pacotes: Entity Framework e angularjs
Altere o arquivo BundleConfig.cs no folder App_Start, para referenciar o
script angular
public class BundleConfig
{
public static void RegisterBundles(BundleCollection bundles)
{
bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
"~/Scripts/jquery-{version}.js"));
bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include(
"~/Scripts/jquery.validate*"));
// Use the development version of Modernizr to develop with and learn from. Then,
when you're
// ready for production, use the build tool at http://modernizr.com to pick only the
tests you need.
bundles.Add(new ScriptBundle("~/bundles/modernizr").Include(
"~/Scripts/modernizr-*"));
bundles.Add(new ScriptBundle("~/bundles/bootstrap").Include(
"~/Scripts/bootstrap.js",
"~/Scripts/respond.js"));
//Referncia ao angularJs
bundles.Add(new ScriptBundle("~/bundles/angularjs").Include(
"~/Scripts/angular.js"));
bundles.Add(new StyleBundle("~/Content/css").Include(
"~/Content/bootstrap.css",
"~/Content/site.css"));
}
GlobalConfiguration.Configure(WebApiConfig.Register);
}
9
//Caso tivssemos optado pela criao do modelo apenas por cdigo
//private readonly PessoaDBContext db = new PessoaDBContext();
//Aqui definiremos as operaes CRUD - Create; Read; Update e Delete
//Definir as Consultas (Read)
[HttpGet]
//Criar a rota para o AngularJs chamada pessoas
[Route("pessoas")]
public IQueryable<Pessoa> ObterPessoas()
{
return _db.Pessoa;
}
[HttpGet]
//Consultar uma pessoa atravs do id
//criar uma rota chamada pessoa e passar chave "id do tipo int"
[Route("pessoa/{id:int}")]
public HttpResponseMessage ObterPorPessoa(int id)
{
if (id <= 0)
{
return Request.CreateResponse(HttpStatusCode.BadRequest);
}
Pessoa pessoa = _db.Pessoa.Find(id);
return Request.CreateResponse(HttpStatusCode.OK, pessoa);
}
//Alterar um registro (Update)
[HttpPut]
[Route("putpessoa")]
public HttpResponseMessage Alterar(Pessoa pessoa)
{
if (pessoa == null)
return Request.CreateResponse(HttpStatusCode.BadRequest);
_db.Entry(pessoa).State = System.Data.Entity.EntityState.Modified;
_db.SaveChanges();
return Request.CreateResponse(HttpStatusCode.OK);
}
//Incluir um registro (Create)
[HttpPost]
[Route("postpessoa")]
public HttpResponseMessage Incluir(Pessoa pessoa)
{
if (pessoa == null)
return Request.CreateResponse(HttpStatusCode.BadRequest);
//Verifiar se j existe uma pessoa cadastrada com o referido id
Pessoa p1 = _db.Pessoa.Find(pessoa.id);
if (p1!=null)
return Request.CreateResponse(HttpStatusCode.Conflict);
_db.Pessoa.Add(pessoa);
_db.SaveChanges();
return Request.CreateResponse(HttpStatusCode.OK);
}
//Excluir um registro (Delete)
[HttpDelete]
[Route("deletepessoa/{id:int}")]
public HttpResponseMessage Excluir(int id)
{
if (id <= 0)
10
return Request.CreateResponse(HttpStatusCode.BadRequest);
Pessoa p1 = _db.Pessoa.Find(id);
_db.Pessoa.Remove(p1);
_db.SaveChanges();
return Request.CreateResponse(HttpStatusCode.OK);
}
//"Matar" as conexes utilizadas
protected override void Dispose(bool disposing)
{
if (disposing)
_db.Dispose();
base.Dispose(disposing);
}
}
11
var app = angular.module("crudApp", []);
Nome do Module;
Um array com todas as dependncias que vamos utilizar no nosso
Module (iremos falar mais sobre isso depois);
12
//Adicionar pessoa
//JSON.stringify, converte uma pessoa no formato JSON.
//Ver mais detalhes abaixo
this.AdicionarPessoa = function (pessoa) {
var resposta = $http({
method: "post",
url: "api/v1/public/postpessoa",
data: JSON.stringify(pessoa),
dataType: "json"
});
return resposta;
}
//Excluir pessoa
this.ExcluirPessoa = function (id) {
// var rs = $http.delete("api/v1/public/deletepessoa/" + id);
var resposta = $http({
method: "delete",
url: "api/v1/public/deletepessoa/" + JSON.stringify(id)
});
return resposta;
}
});
Criando o Controller
Os Controllers no AngularJS so os componentes (objetos JavaScript) que
fazem a ligao da nossa camada de visualizao (View) com os dados de
nossa aplicao (atravs do Service). So eles que trabalham e manipulam
os dados de nossas aplicaes.
Os Controllers so utilizados atravs da diretiva ng-controller (no
Index.html). Quando utilizamos um Controller em nossa aplicao, criamos
um objeto especial chamado $scope.
O objeto $scope um objeto JavaScript comum e no contexto de nossas
aplicaes ele seria a nossa camada Model da estrutura MVC. Dessa
13
maneira tanto a nossa camada de visualizao (View), quanto a nossa
camada de controladores (Controller) tem acesso aos dados do objeto
$scope. atravs desse objeto que o AngularJS realiza o binding dos dados.
No folder App, adicione um arquivo javascript nomeado Controller.js.
Digite o cdigo abaixo. Utilizaremos a varivel app, onde definiremos o
Controller para a crudCtrl definida anteriormente no arquivo Index.html.
Criaremos uma funo para acessar os servios do Banco. Atravs do
parmetro $scope, iremos acessar os servios crudService (definido em
Service.js) e trazer as informaes do Banco.
app.controller("crudCtrl", function ($scope, crudService) {
//Oculta a divPessoa no arquivo Index.cshtml
$scope.divPessoa = false;
$scope.readonlyId = true;
// funo para enviar o formulrio depois que a validao estiver ok
$scope.submitForm = function (isValid) {
// verifica se o formulrio vlido
if (isValid) {
}
};
obterPessoas();
function obterPessoas()
{
var pessoasData = crudService.ObterPessoas();
pessoasData.then(function (pessoa) {
//pessoa.data o retorno do JASON
$scope.pessoas = pessoa.data;
}, function () {
alert("Erro ao obter pessoas.", "Minha aplicao");
});
}
//Obter pessoa por id
$scope.obterPessoaPorId = function (pessoa) {
var pessoaData = crudService.ObterPessoaPorId(pessoa.id);
pessoaData.then(function(_pessoa){
$scope.pessoa = _pessoa.data;
$scope.id = pessoa.id;
$scope.nome = pessoa.nome;
$scope.email = pessoa.email;
$scope.Action = "Atualizar";
$scope.divPessoa = true;
$scope.readonlyId = true;
}, function () {
alert("Erro ao obter pessoa por id.", "Minha aplicao");
});
$scope.AdicionarAtualizarPessoa = function () {
var pessoa = {
id: $scope.id,
14
nome: $scope.nome,
email: $scope.email,
};
var valorAcao = $scope.Action;
if (valorAcao == "Atualizar") {
var pessoaData = crudService.AtualizarPessoa(pessoa);
pessoaData.then(function (data) {
obterPessoas();
$scope.divPessoa = false;
if (data.status == 200) {
alert("Pessoa alterada com sucesso!", "Minha aplicao");
}
}, function () {
alert("Erro ao atualizar!", "Minha aplicao");
});
} else {
var pessoaData = crudService.AdicionarPessoa(pessoa);
pessoaData.then(function (data) {
obterPessoas();
if (data.status == 200) {
alert("Pessoa cadastrada com sucesso!", "Minha aplicao");
}
$scope.divPessoa = false;
}, function (data) {
if (data.status == 409) {
alert("Id j existente!", "Minha aplicao");
}
else {
alert("Erro ao incluir!", "Minha aplicao");
}
});
}
}
$scope.incluirPessoa = function () {
limparCampos();
$scope.Action = "Adicionar";
$scope.readonlyId = false;
$scope.divPessoa = true;
}
$scope.Cancelar = function () {
$scope.readonlyId = true;
$scope.divPessoa = false;
};
function limparCampos() {
$scope.id = "";
$scope.nome = "";
$scope.email = "";
}
//Excluir uma pessoa
$scope.excluirPessoa = function (pessoa) {
var pessoaData = crudService.ExcluirPessoa(pessoa.id);
//pessoaData recebe retorno da operao excluir. Se sucesso, executa o then
pessoaData.then(function (data) {
if (data.status == 200) {
alert("Pessoa excluda com sucesso.", "Minha aplicao");
}
obterPessoas();
15
}, function () {
alert("Erro ao excluir pessoas.", "Minha aplicao");
});
}
});
Arquivo Index
Editar o arquivo Index.cshtml
@{
ViewBag.Title = "Home Page";
}
<div ng-controller="crudCtrl">
<div class="divList">
<p><b><i>Todas as Pessoas</i></b></p>
<table class="table table-hover">
<tr>
<td><b>ID</b></td>
<td><b>Nome</b></td>
<td><b>E-mail</b></td>
</tr>
<tr ng-repeat="pessoa in pessoas">
<td> {{pessoa.id}}</td>
<td> {{pessoa.nome}}</td>
<td> {{pessoa.email}}</td>
<td>
<span ng-click="obterPessoaPorId(pessoa)" class="btn btnprimary">Alterar</span>
16
<span ng-click="excluirPessoa(pessoa)" class="btn btndanger">Excluir</span>
</td>
</tr>
</table>
<span ng-click="incluirPessoa()" class="btn btn-default">Incluir Pessoa</span>
<div ng-show="divPessoa">
<p class="divHead"></p>
<table class="table">
<tr>
<td><b><i>{{Acao}}Pessoa</i></b></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td><b>ID</b></td>
<td>
<!--Utilizamos o ng-model para realizar o bind (ligar) s propriedades de
pessoa
no controller-->
<input type="text" ng-readonly="readonlyId" ng-model="id"
class="form-control" />
</td>
</tr>
<tr>
<td><b>Nome</b></td>
<td>
<input type="text" ng-model="nome" class="form-control" />
</td>
</tr>
<tr>
<td><b>E-mail</b></td>
<td>
<input type="text" ng-model="email" class="form-control" />
</td>
</tr>
<tr>
<td>
<input type="button" class="btn btn-default" value="Salvar" ngclick="AdicionarAtualizarPessoa()" />
<input type="button" class="btn btn-danger" value="Cancelar" ngclick="Cancelar()" />
</td>
</tr>
</table>
</div>
</div>
Arquivo _Layout
Definio do local para iniciar o AngujarJs. Adicione o ng-app:
<html ng-app="crudApp">
17
Neste caso, definimos que toda a regio dentro da tag <html> far parte da
app AngularJs.
<!DOCTYPE html>
<html ng-app="crudApp">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>@ViewBag.Title - My ASP.NET Application</title>
@Styles.Render("~/Content/css")
@Scripts.Render("~/bundles/modernizr")
</head>
<body>
<div class="navbar navbar-inverse navbar-fixed-top">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" datatarget=".navbar-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
@Html.ActionLink("Minha aplicao", "Index", "Home", new { area = "" }, new
{ @class = "navbar-brand" })
</div>
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li>@Html.ActionLink("Incio", "Index", "Home")</li>
<li>@Html.ActionLink("Sobre", "About", "Home")</li>
<li>@Html.ActionLink("Contato", "Contact", "Home")</li>
</ul>
</div>
</div>
</div>
<div class="container body-content">
@RenderBody()
<hr />
<footer>
<p>© @DateTime.Now.Year - Minha Aplicao ASP.NET com AngularJS</p>
</footer>
</div>
@Scripts.Render("~/bundles/jquery")
@Scripts.Render("~/bundles/bootstrap")
@Scripts.Render("~/bundles/angularjs")
@Scripts.Render("~/bundles/customjs")
@RenderSection("scripts", required: false)
</body>
</html>
18
Validando o formulrio
Para comear vamos listar os requisitos do formulrio
Id obrigatrio;
nome obrigatrio e comprimento mnimo de 5 caracteres;
email no obrigatrio, mas tem que ser um e-mail vlido;
Formulrio de envio desativado se o formulrio no vlido;
Mostrar um erro de e-mail obrigatrio ou invlido.
Descrio
$valid
$invalid
19
Proprieda
de
Descrio
definidas.
$pristine
$dirty
ex: userForm.$valid
20
<input type="email" ng-model="email" class="form-control" />
</td>
</tr>
<tr>
<td>
<input type="button" class="btn btn-default" value="Salvar" ngclick="AdicionarAtualizarPessoa()" ng-disabled="userForm.$invalid"/>
<input type="button" class="btn btn-danger" value="Cancelar" ngclick="Cancelar()" />
</td>
</tr>
</table>
</form>
</div>