Explorar E-books
Categorias
Explorar Audiolivros
Categorias
Explorar Revistas
Categorias
Explorar Documentos
Categorias
Language : C#
Platform : All Platforms
Project Type : Console
Selecione o tipo de projeto : Console App (.NET Core) e clique
em Next;
Frameworks Símbolos
.NET Framework NET20, NET35, NET40, NET45, NET451, NET452, NET46, NET461, NET462, NET4
E estamos conversados...
Palavra fiel é esta: que, se morrermos com ele, também com ele viveremos;
Se sofrermos, também com ele reinaremos; se o negarmos, também ele nos
negará;
Se formos infiéis, ele permanece fiel; não pode negar-se a si mesmo.
2 Timóteo 2:11-13
Palavra fiel é esta: que, se morrermos com ele, também com ele viveremos;
Se sofrermos, também com ele reinaremos; se o negarmos, também ele nos
negará;
Se formos infiéis, ele permanece fiel; não pode negar-se a si mesmo.
2 Timóteo 2:11-13
Palavra fiel é esta: que, se morrermos com ele, também com ele viveremos;
Se sofrermos, também com ele reinaremos; se o negarmos, também ele nos
negará;
Se formos infiéis, ele permanece fiel; não pode negar-se a si mesmo.
2 Timóteo 2:11-13
'Bora' pro código...
Recursos :
using Microsoft.EntityFrameworkCore;
namespace AspNet_Paginacao1.Models
{
public class AppDbContext : DbContext
{
public AppDbContext(DbContextOptions options) : base(options)
{ }
opts.UseSqlServer(Configuration.GetConnectionString(" sqlConnection")));
services.AddControllersWithViews();
}
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"ConnectionStrings": {
"sqlConnection": "Data Source=Macoratti;Initial Catalog= ContatosDB;Integrated
Security=True"
},
"AllowedHosts": "*"
}
...
<ul class="navbar-nav flex-grow-1">
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-
action="Index">Home</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-controller="Clientes" asp-
action="Index">Clientes</a>
</li>
</ul>
...
using X.PagedList;
@model
X.PagedList.IPagedList<AspNet_Paginacao1.Models.Cliente>
@using X.PagedList.Mvc.Core;
@{
ViewData["Title"] = "Index";
}
<h1>Index</h1>
<p>
<a asp-action="Create">Criar Novo</a>
</p>
<table class="table">
<thead>
<tr>
<th> Nome</th>
<th> Endereço</th>
<th> Email</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach (var item in Model)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.Nome)
</td>
<td>
@Html.DisplayFor(modelItem => item.Endereco)
</td>
<td>
@Html.DisplayFor(modelItem => item.Email)
</td>
<td>
<a asp-action="Edit" asp-route-
id="@item.ClienteId">Edita</a> |
<a asp-action="Details" asp-route-
id="@item.ClienteId">Detalhe</a> |
<a asp-action="Delete" asp-route-
id="@item.ClienteId">Deleta</a>
</td>
</tr>
}
</tbody>
</table>
@Html.PagedListPager(Model, pagina => Url.Action("Index", new
{ pagina }))
Referências:
ASP.NET Core MVC - Criando um Dashboard ... - Macoratti.net
ASP .NET Core MVC - CRUD básico com ADO .NET - Macoratti
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}
using Microsoft.EntityFrameworkCore;
namespace Api_AnalyzersDemo.Models
{
public class AppDbContext : DbContext
{
public AppDbContext(DbContextOptions<AppDbContext> options)
: base(options)
{}
...
services.AddDbContext<AppDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConn
ection")));
...
{
"ConnectionStrings": {
"DefaultConnection": "Data Source=Macoratti;Initial
Catalog=EscolaDB;Integrated Security=True"
},
"Logging": {
"LogLevel": {
"Default": "Warning"
}
},
"AllowedHosts": "*"
}
...
// PUT: api/Alunos/5
[HttpPut("{id}")]
public async Task<IActionResult> PutAluno(int id, Aluno aluno)
{
if (id != aluno.AlunoId)
{
return BadRequest();
}
_context.Entry(aluno).State = EntityState.Modified;
try
{
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!AlunoExists(id))
{
return NotFound();
}
else
{
throw;
}
}
return NoContent();
}
...
BadRequest - 400
NotFound - 404
NoContent - 204
1- Microsoft.AspNetCore.Mvc.ApiConventionMethodAttribute
Neste exemplo a
convenção Microsoft.AspNetCore.Mvc.DefaultApiConventions.Pu
t aplica os seguintes atributos ao método Action:
[ProducesDefaultResponseType]
[ProducesResponseType(StatusCodes.Status204NoContent)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
2- Microsoft.AspNetCore.Mvc.ApiConventionTypeAttribute aplic
ado ao Controller
[ApiController]
[ApiConventionType(typeof(DefaultApiConventions))]
[Route("api/[controller]")]
public class ContatosController : ControllerBase
{
}
3- Microsoft.AspNetCore.Mvc.ApiConventionTypeAttribute aplic
ado ao assembly
assembly: ApiConventionType(typeof(DefaultApiConventions))]
namespace ApiConventions
{
public class Startup
{}
...
}
Quando você cria uma aplicação ASP .NET Core MVC usando o
template Web Application(Model-View-Controller) com
autenticação através da opção Individual User Accounts, o
projeto criado possui toda a estrutura para realizar a
autenticação e o registro do usuário.
Recursos usados:
Data
Classe ApplicationDBContext com
diferentes scripts de migração para
criar as tabelas do banco de dados
Extensions
Classes para confirmação do email,
resetar passwaord, etc.
Models
AccountViewModels(LoginViewMode
l, RegisterViewModel, etc)
ManageViewModels(ChangePassword
ViewModel,
EnableAuthenticationViewModel,
etc)
ApplicationUser
ErrorViewModel
Services
Serviço para Enviar Email
Views
Views para Account, Manage,
Home, About, Contact etc
appsettings.json - arquivo de
configuração contendo a string de
conexão para o banco de dados
{
"ConnectionStrings": {
"DefaultConnection":
"Server=(localdb)\\mssqllocaldb;Database=AspNet_RolesDB;Trusted_Connect
ion=True;MultipleActiveResultSets=true"
},
"Logging": {
"IncludeScopes": false,
"LogLevel": {
"Default": "Warning"
}
}
}
app.UseStaticFiles();
app.UseAuthentication();
CreateRoles(serviceProvider).Wait();
}
Aguardem...
Recursos usados:
using Microsoft.AspNetCore.Mvc.Rendering;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
namespace AspCore_Roles.Models.AccountViewModels
{
public class RegisterViewModel
{
[Required]
[EmailAddress]
[Display(Name = "Email")]
public string Email { get; set; }
[Required]
[StringLength(100, ErrorMessage = "The {0} must be at least {2} and at max
{1} characters long.", MinimumLength = 6)]
[DataType(DataType.Password)]
[Display(Name = "Password")]
public string Password { get; set; }
[DataType(DataType.Password)]
[Display(Name = "Confirm password")]
[Compare("Password", ErrorMessage = "The password and confirmation
password do not match.")]
public string ConfirmPassword { get; set; }
[DataType(DataType.Text)]
[Display(Name = "Perfis de usuário : ")]
[UIHint("List")]
public List<SelectListItem> Roles { get; set; }
public RegisterViewModel()
{
Roles = new List<SelectListItem>();
Roles.Add(new SelectListItem(){Value = "1", Text = "Admin" });
Roles.Add(new SelectListItem(){Value = "2", Text = "Operator" });
Roles.Add(new SelectListItem(){Value = "3", Text = "User" });
}
}
}
No controlador AccountController altere o
método Register conforme mostrado abaixo:
[HttpGet]
[AllowAnonymous]
public IActionResult Register(string returnUrl = null)
{
RegisterViewModel registerViewModel = new
RegisterViewModel();
ViewData["ReturnUrl"] = returnUrl;
return View(registerViewModel);
}
@model RegisterViewModel
@{
ViewData["Title"] = "Register";
}
<h2>@ViewData["Title"]</h2>
<div class="row">
<div class="col-md-4">
<form asp-route-returnUrl="@ViewData["ReturnUrl"]"
method="post">
<h4>Create a new account.</h4>
<hr />
<div asp-validation-summary="All" class="text-danger"></div>
<div class="form-group">
<label asp-for="Email"></label>
<input asp-for="Email" class="form-control" />
<span asp-validation-for="Email" class="text-
danger"></span>
</div>
<div class="form-group">
<label asp-for="Password"></label>
<input asp-for="Password" class="form-control" />
<span asp-validation-for="Password" class="text-
danger"></span>
</div>
<div class="form-group">
<label asp-for="ConfirmPassword"></label>
<input asp-for="ConfirmPassword" class="form-control" />
<span asp-validation-for="ConfirmPassword" class="text-
danger"></span>
</div>
<div class="form-group">
<label asp-for="Roles"></label>
@Html.DropDownList("Role", new
SelectList(Model.Roles, "Text", "Text"))
</div>
<div class="form-group">
<button type="submit" class="btn btn-
default">Register</button>
</div>
</form>
</div>
</div>
@section Scripts {
@await Html.PartialAsync("_ValidationScriptsPartial")
}
Recursos usados:
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Register(RegisterViewModel model,
string returnUrl = null)
{
ViewData["ReturnUrl"] = returnUrl;
if (ModelState.IsValid)
{
var user = new ApplicationUser { UserName = model.Email, Email
= model.Email };
var result = await _userManager.CreateAsync(user,
model.Password);
if (result.Succeeded)
{
_logger.LogInformation("User created a new account with
password.");
//-------------------atribuir role ao
user------------------------------
var applicationRole = await
_roleManager.FindByNameAsync(model.Role);
if (applicationRole != null)
{
IdentityResult roleResult = await
_userManager.AddToRoleAsync(user, applicationRole.Name);
}
//-------------------atribuir role ao
user------------------------------
[Authorize]
[Route("[controller]/[action]")]
public class AccountController : Controller
{
private readonly UserManager<ApplicationUser> _userManager;
private readonly SignInManager<ApplicationUser> _signInManager;
private readonly IEmailSender _emailSender;
private readonly ILogger _logger;
private readonly RoleManager<IdentityRole> _roleManager;
[Authorize(Roles = "Admin")]
public IActionResult Contact()
{
ViewData["Message"] = "Página de contato do Admin.";
return View();
}
O objetivo
Aplicações para dispositivos móveis podem se comunicar
facilmente com serviços backend ASP .NET Core e este artigo
vai demonstrar como criar serviços backend usando ASP .NET
Core MVC para suportar aplicações mobiles nativas.
using Microsoft.AspNetCore.Hosting;
namespace TarefaAPI
{
public class Program
{
public static void Main(string[] args)
{
var host = new WebHostBuilder()
.UseKestrel()
.UseUrls("http://*:5000")
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.UseStartup<Startup>()
.UseApplicationInsights()
.Build();
host.Run();
}
}
}
using System.ComponentModel.DataAnnotations;
namespace TarefaAPI.Models
{
public class TarefaItem
{
[Required]
public string ID { get; set; }
[Required]
public string Nome { get; set; }
[Required]
public string Notas { get; set; }
public bool Concluido { get; set; }
}
}
using System.Collections.Generic;
namespace TarefaAPI.Models
{
public interface ITarefaRepositorio
{
bool ItemExiste(string id);
IEnumerable<TarefaItem> All { get; }
TarefaItem Find(string id);
void Insert(TarefaItem item);
void Update(TarefaItem item);
void Delete(string id);
}
}
using System.Collections.Generic;
using System.Linq;
namespace TarefaAPI.Models
{
public class TarefaRepositorio : ITarefaRepositorio
{
private List<TarefaItem> _tarefaLista;
public TarefaRepositorio()
{
InitializeData();
}
private void InitializeData()
{
_tarefaLista = new List<TarefaItem>();
var tarefaItem1 = new TarefaItem
{
ID = "T100",
Nome = "Criando aplicações com Xamarin",
Notas = "Xamarin University",
Concluido = true
};
var tarefaItem2 = new TarefaItem
{
ID = "T200",
Nome = "Desenvolvimento de aplicação multiplataforma",
Notas = "Xamarin Studio/Visual Studio",
Concluido = false
};
var tarefaItem3 = new TarefaItem
{
ID = "T300",
Nome = "Publicando Aplicações",
Notas = "Azure Cloud",
Concluido = false,
};
_tarefaLista.Add(tarefaItem1);
_tarefaLista.Add(tarefaItem2);
_tarefaLista.Add(tarefaItem3);
}
public IEnumerable<TarefaItem> All
{
get { return _tarefaLista; }
}
public void Delete(string id)
{
_tarefaLista.Remove(this.Find(id));
}
public TarefaItem Find(string id)
{
return _tarefaLista.FirstOrDefault(item => item.ID == id);
}
public void Insert(TarefaItem item)
{
_tarefaLista.Add(item);
}
public bool ItemExiste(string id)
{
return _tarefaLista.Any(item => item.ID == id);
}
public void Update(TarefaItem item)
{
var tarefaItem = this.Find(item.ID);
var index = _tarefaLista.IndexOf(tarefaItem);
_tarefaLista.RemoveAt(index);
_tarefaLista.Insert(index, item);
}
}
}
using AspnetCore_WebApi.Models;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
...
public class Startup
{
...
// This method gets called by the runtime. Use this method to add
services to the container.
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddMvc();
services.AddSingleton<ITarefaRepositorio,
TarefaRepositorio>();
}
...
}
using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;
using TarefaAPI.Models;
namespace TarefaAPI.Controllers
{
[Route("api/[controller]")]
public class TarefaController : Controller
{
private readonly ITarefaRepositorio _tarefaRepositorio;
public TarefaController(ITarefaRepositorio tarefaRepositorio)
{
_tarefaRepositorio = tarefaRepositorio;
}
}
}
Entendendo o código:
[HttpGet]
public IActionResult List()
{
return Ok(_tarefaRepositorio.All);
}
A rota para esta Action é a rota especificada no controlador.
Você não é obrigato a usar o nome da Action como parte da
rota, mas tem que assegurar que cada Action possua uma única
rota.
Entendendo o código:
{
"ID": "T400",
"Nome": "Incluindo um novo item",
"Notas": "testando POST",
"Concluido" : false
}
O novo item criado e retornado e exibido conforme a figura
acima.
[HttpPut("{id}")]
public IActionResult Edit(string id, [FromBody] TarefaItem item)
{
try
{
//Valida o modelo
if (item == null || !ModelState.IsValid)
{
//reproduz um Http Erro 400 - Requisição inválida
return
BadRequest(ErrorCode.TarefaItemNomeENotasRequired.ToString());
}
//localiza o item via método Find do repositório
var itemExistente = _tarefaRepositorio.Find(id);
if (itemExistente == null)
{
//reproduz um Http Erro 404 - Não Encontrado
return
NotFound(ErrorCode.RegistroNaoEncontrado.ToString());
}
//atualiza o item chamando o método do repositorio
_tarefaRepositorio.Update(item);
}
catch (Exception)
{
//reproduz um Http Erro 400 - Requisição inválida
return
BadRequest(ErrorCode.NaoPodeAtualizarItem.ToString());
}
return NoContent();
}
{
"ID": "T100",
"Nome": "alterando um item",
"Notas": "testando PUT",
"Concluido" : false
}
7. Clique no botão Send;
[HttpDelete("{id}")]
public IActionResult Delete(string id)
{
try
{
//localiza o item via método Find do repositório
var item = _tarefaRepositorio. Find(id);
if (item == null)
{
//reproduz um Http Erro 404 - Não Encontrado
return
NotFound(ErrorCode.RegistroNaoEncontrado.ToString());
}
//deleta item chamando o método do repositorio
_tarefaRepositorio.Delete(id);
}
catch (Exception)
{
//reproduz um Http Erro 400 - Requisição inválida
return
BadRequest(ErrorCode.NaoPodeDeletarItem.ToString());
}
return NoContent();
}
Recursos usados:
namespace XF_Tarefas.Models
{
public class TarefaItem
{
public string ID { get; set; }
public string Nome { get; set; }
public string Notas { get; set; }
public bool Concluido { get; set; }
}
}
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using XF_Tarefas.Models;
namespace XF_Tarefas.Service
{
public class DataService
{
HttpClient client = new HttpClient();
public async Task<List<TarefaItem>> GetTarefasAsync()
{
try
{
string url = "http://192.168.1.18:5000/api/tarefa";
var response = await client. GetStringAsync(url);
var tarefas =
JsonConvert.DeserializeObject<List<TarefaItem>>(response);
return tarefas;
}
catch (Exception ex)
{
throw ex;
}
}
public async Task AddTarefaAsync(TarefaItem tarefa)
{
try
{
string url = "http://192.168.1.18:5000/api/tarefa/{0}";
var uri = new Uri(string.Format(url, tarefa.ID));
var data = JsonConvert.SerializeObject(tarefa);
var content = new StringContent(data, Encoding.UTF8,
"application/json");
HttpResponseMessage response = null;
response = await client.PostAsync(uri, content);
if (!response.IsSuccessStatusCode)
{
throw new Exception("Erro ao incluir tarefa");
}
}
catch (Exception ex)
{
throw ex;
}
}
public async Task UpdateTarefaAsync(TarefaItem tarefa)
{
string url = "http://192.168.1.18:5000/api/tarefa/{0}";
var uri = new Uri(string.Format(url, tarefa.ID));
var data = JsonConvert.SerializeObject(tarefa);
var content = new StringContent(data, Encoding.UTF8,
"application/json");
HttpResponseMessage response = null;
response = await client.PutAsync(uri, content);
if (!response.IsSuccessStatusCode)
{
throw new Exception("Erro ao atualizar tarefa");
}
}
public async Task DeletaTarefaAsync(TarefaItem tarefa)
{
try
{
string url = "http://192.168.1.18:5000/api/tarefa/{0}";
var uri = new Uri(string.Format(url, tarefa.ID));
await client.DeleteAsync(uri);
}
catch (Exception ex)
{
throw ex;
}
}
}
}
</ContentPage>
Recursos usados:
DataService dataService;
List<TarefaItem> tarefas;
public MainPage()
{
InitializeComponent();
dataService = new DataService();
AtualizaDados();
}
Método AtualizaDados()
A seguir temos o código do método AtualizaDados():
tarefaAtualizar.Nome = txtNome.Text;
tarefaAtualizar.Notas = txtNotas.Text;
tarefaAtualizar.Concluido = opConcluido.IsToggled;
await dataService.UpdateTarefaAsync(tarefaAtualizar);
LimpaTarefa();
AtualizaDados();
}
catch (Exception ex)
{
await DisplayAlert("Erro", ex.Message, "OK");
}
}
else
{
await DisplayAlert("Erro", "Dados inválidos...", "OK");
}
}
Para atualizar uma tarefa você tem que selecionar a tarefa que
deseja alterar no ListView para que os dados da tarefa sejam
exibidos nas views Entry/Switch acima do ListView.
await dataService.DeletaTarefaAsync(tarefaDeletar);
LimpaTarefa();
AtualizaDados();
}
catch (Exception ex)
{
await DisplayAlert("Erro", ex.Message, "OK");
}
}
Microsoft.AspNetCore.SpaTemplates - Se conecta
ao dotnet new, fornecendo modelos de projeto para
aplicações Angular 2, Aurelia, Knockout, React e React +
Redux;
Microsoft.AspNetCore.SpaServices - É como os projetos
produzidos pelo SpaTemplates funcionam internamente.
Ele fornece recursos úteis para aplicativos SPA, como
renderização do lado do servidor para aplicações Angular
e React, além de integração com o middleware de
construção Webpack;
Microsoft.AspNetCore.NodeServices - É como
o SpaServices funciona internamente. É uma biblioteca
de baixo nível que fornece uma maneira rápida e robusta
para que os aplicativos ASP.NET Core executem código
JavaScript arbitrário no servidor.
Comando Ação
Referências: https://docs.microsoft.com/pt-
br/dotnet/articles/core/tools/dotnet
Agora vamos abrir uma janela de prompt de comando ou janela
de console. Se você estiver usando o Windows 10 como eu, uma
maneira de abrir essa janela é :
Ele faz isso sem causar uma recarga de página inteira (porque
isso pode apagar o estado útil, como qualquer sessão de
depuração em andamento). Assim , ele atualiza diretamente os
módulos afetados no seu aplicativo em execução.
(Disse Jesus) : Passará o céu e a terra, mas as minhas
palavras não hão de passar. Lucas 21:33
Referências:
Seção VB .NET do Site Macoratti.net
Super DVD .NET - A sua porta de entrada na plataforma .NET
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
Seção C# do site Macoratti.net
Super DVD C#
Super DVD Visual Basic
Curso Básico VB .NET - Vídeo Aulas
Curso C# Básico - Vídeo Aulas
.NET - Apresentando o AngularJS - Macoratti.net
ASP.NET MVC - Usando o AngularJS - I - Macoratti.net
.NET - Criando um livro de contatos usando o AngularJS
Compreendendo o Data Binding no AngularJS - Macoratti.net
.NET - Apresentando o AngularJS
http://www.macoratti.net/14/02/net_angjs1.htm
O que é o AngularJS ?
Objetivos:
1.<!doctype html>
2.<html ng-app>
3. <head>
4. <script
src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.6/angular.min.js"></scrip
t>
5. </head>
6. <body>
7. <div>
8. <label>Nome:</label>
9. <input type="text" ng-model="SeuNome" placeholder="Informe o seu nome aqui">
10. <hr>
11. <h1>Feliz 2014, {{SeuNome}}!</h1>
12. </div>
13. </body>
14.</html>
Veja o resultado:
.<!doctype html>
<html ng-app>
<head>
<script src="http://code.angularjs.org/1.2.6/angular.min.js"></script>
</head>
<body>
<div ng-init="qtde=1;custo=20">
<b>Pedido:</b>
<div>
Quantidade: <input type="number" ng-model="qtde" required >
</div>
<div>
Valor: <input type="number" ng-model="custo" required >
</div>
<div>
<b>Total:</b> {{qtde * custo | currency}}
</div>
</div>
</body>
</html
Referências:
http://docs.angularjs.org/guide/concepts
http://docs.angularjs.org/guide/
http://angularjs.org/
ASP .NET - Apresentando JQuery - Macoratti.net
jQuery- Usando jQuery com ASP .NET - Macoratti.net
jQuery - Conceitos - Macoratti.net
.NET - Usando BootStrap - pontapé inicial - Macoratti.net
ASP .NET - BootStrap 3.0 com Web Forms - Macoratti.net
ASP .NET MVC - Usando o AngularJS
http://www.macoratti.net/15/02/aspn_ajs1.htm
Recursos usados:
Microsoft VIsual Studio 2013 Express for web
AngularJS
...
bundles.Add(new ScriptBundle("~/bundles/angular").Include(
"~/Scripts/angular.js",
"~/Scripts/angular-route.js"));
...
(function () {
//Cria um Module
// será usado ['ng-Route'] quando implementarmos o roteamento
var app = angular.module('MacApp', ['ngRoute']);
//Cria um Controller
// aqui $scope é usado para compartilhar dados entre a view e o
controller
app.controller('HomeController', function ($scope) {
$scope.Mensagem = "Olá. Esse é nosso primeiro contato com o
AgularJS no ASP .NEt MVC.";
});
})();
@{
ViewBag.Title = "Index";
}
<h2>Index</h2>
<div ng-controller="HomeController">
{{Mensagem}}
</div>
View Index.cshtml
Recursos necessários:
Objetivo:
<!doctype html>
<html ng-app>
<head>
<script src="js/angular.min.js"></script>
<script src="js/func.js"></script>
</head>
<body>
<div ng-controller="ContatoController">
<form>
<table>
<tr>
<td>Nome</td>
<td><input type="text" name="nome" ng-model="novocontato.nome"/></td>
</tr>
<tr>
<td>Email</td>
<td><input type="text" name="email" ng-model="novocontato.email"/></td>
</tr>
<tr>
<td>Fone</td>
<td><input type="text" name="fone" ng-model="novocontato.fone"/></td>
</tr>
<tr>
<td><input type="hidden" ng-model="novocontato.id" /></td>
<td><input type="button" value="Salvar" ng-click="salvaContato()" /></td>
</tr>
</table>
</form>
<table border="1">
<tr>
<th>Nome</th>
<th>Email</th>
<th>Fone</th>
<th>Ação</th>
</tr>
<tr ng-repeat="contato in contatos">
<td>{{ contato.nome }}</td>
<td>{{ contato.email }}</td>
<td>{{ contato.fone }}</td>
<td>
<a href="#" ng-click="edita(contato.id)">edita</a> |
<a href="#" ng-click="deleta(contato.id)">deleta</a>
</td>
</tr>
</table>
</div>
</body>
</html>
Criamos uma tabela onde iremos exibir os valores para nome, email e
contato e usamos a marcação {{ }} onde os valores serão exibidos
após o parse e a diretiva ng-click para tratar os eventos para editar e
deletar contatos:
<table border="1">
<tr>
<th>Nome</th>
<th>Email</th>
<th>Fone</th>
<th>Ação</th>
</tr>
<tr ng-repeat="contato in contatos">
<td>{{ contato.nome }}</td>
<td>{{ contato.email }}</td>
<td>{{ contato.fone }}</td>
<td>
<a href="#" ng-click="edita(contato.id)">edita</a> |
<a href="#" ng-click="deleta(contato.id)">deleta</a>
</td>
</tr>
</table>
var uid = 0;
function ContatoController($scope) {
$scope.contatos = [ ];
$scope.salvaContato = function() {
if($scope.novocontato.id == null) {
//novo contato
$scope.novocontato.id = uid++;
$scope.contatos.push($scope.novocontato);
}
//atualiza um contato existente
else {
for(i in $scope.contatos) {
if($scope.contatos[i].id == $scope.novocontato.id) {
$scope.contatos[i] = $scope.novocontato;
}
}
}
$scope.novocontato = {};//limpa o formulário
}
$scope.deleta = function(id) {
João 3:31 Aquele que vem de cima é sobre todos; aquele que vem da
terra é da terra, e fala da terra. Aquele que vem do céu é sobre todos.
João 3:32 Aquilo que ele tem visto e ouvido, isso testifica; e ninguém
aceita o seu testemunho.
João 3:33 Mas o que aceitar o seu testemunho, esse confirma que Deus
é verdadeiro.
.NET - Compreendendo o Data Binding no
AngularJS
http://www.macoratti.net/15/02/angjs_3.htm
O DataBinding no AngularJS
<!DOCTYPE html>
<html>
<title>Angular DataBinding usando Diretivas - ng-int e ng-
repeat</title>
<head>
<script
src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.26/angular.
min.js"></script>
</head>
<body ng-app>
<div ng-init="jogadores = [{nome:'Rooney', pais:'Inglaterra'},
{nome:'Neymar', pais:'Brasil'},
{nome:'Messy', pais:'Argentina'}]">
<ul>
<li ng-repeat="jogador in jogadores">
[{{$index}}] {{jogador.nome}} : {{jogador.pais}}
</li>
</ul>
</div>
</body>
</html>
http://www.macoratti.net/16/03/mvc_angapi1.htm
Neste
artigo eu
vou
mostrar
como criar
uma
aplicação
web
usando os
recursos
da ASP
.NET MVC
5, do
AngularJS
e da Web
API.
Recursos usados:
http://www.macoratti.net/16/03/mvc_angapi2.htm
Neste
artigo eu
vou
mostrar
como
criar uma
aplicação
web
usando
os
recursos
da ASP .
NET
MVC 5,
do
AngularJ
S e da
Web
API.
O método ConfigureServices
O método ConfigureServices nos permite adicionar ou registrar
serviços no Aplicativo. As outras partes do nosso aplicativo
podem solicitar esses serviços via injeção de dependência.
O método Configure
O método Configure nos permite configurar o pipeline de
requisição HTTP que especifica como o aplicativo deve
responder a solicitações HTTP.
O que é o Kestrel
O Kestrel é um servidor HTTP baseado em E/S assíncrona, em
eventos, de código aberto e multiplataforma. Ele foi
desenvolvido para hospedar aplicações ASP.NET Core em
qualquer plataforma, e, está incluído por padrão nas aplicações
ASP.NET Core.
HTTPS
Atualização do Opaque usado para habilitar o WebSockets
Soquetes do UNIX para alto desempenho protegidos pelo
Nginx
HTTP/2 (exceto em macOS†)
Usando o Kestrel
O servidor Kestrel é executado in-process no ASP .NET Core
Applications. Portanto, ele é executado independentemente do
ambiente no qual reside; ele esta disponível no
namespace Microsoft.AspNetCore.Server.Kestrel.
1. Self-Hosting (Autocontido)
2. Atrás de outro Web Server
1. Segurança
2. Poder limitar sua área de superfície exposta. Ele fornece
uma camada adicional opcional de configuração e defesa;
3. Simplificar o balanceamento de carga;
4. Configuração SSL;
5. Apenas seu servidor proxy reverso requer um certificado
SSL e esse servidor pode se comunicar com seus servidores
de aplicativos na rede interna usando HTTP simples;
6. Compartilhar IP Único com vários Endereços;
7. Solicitação de Filtragem, registro em log e URLs, etc.;
8. Poder garantir que o aplicativo seja reiniciado se houver
falhas;
http://www.macoratti.net/18/08/aspn_gfcg1.htm
Hoje vamos criar uma aplicação ASP .NET Core para fazer o
gerenciamento de despesas pessoais e exibir um gráfico das
despesas usando os recursos do Entity Framework Core 2.0 .
Abrindo a classe Startup definimos no
método ConfigureServices o código conforme mostrado abaixo
para registrar o nosso contexto como um serviço :
using Microsoft.EntityFrameworkCore;
using MinhasFinancas.Models;
using System;
using System.Collections.Generic;
using System.Linq;
namespace MinhasFinancas.DAL
{
public class FinancasDAL : IFinancasDAL
{
public FinancasDAL() { }
private readonly AppDbContext db;
public FinancasDAL(AppDbContext context)
{
db = context;
}
public IEnumerable<RelatorioDespesa> GetAllDespesas()
{
try
{
return db.RelatorioDespesas.ToList();
}
catch { throw; }
}
// Filtra os registros com base na string de busca
public IEnumerable<RelatorioDespesa> GetFiltraDespesa(string criterio)
{
List<RelatorioDespesa> desp = new List<RelatorioDespesa>();
try
{
desp = GetAllDespesas().ToList();
return desp.Where(x => x.ItemNome.IndexOf(criterio,
StringComparison.OrdinalIgnoreCase) != -1);
}
catch{ throw; }
}
//Adicionar uma nova despesas
public void AddDespesa(RelatorioDespesa despesa)
{
try
{
db.RelatorioDespesas.Add(despesa);
db.SaveChanges();
}
catch{ throw; }
}
//atualizar uma despesa
public int UpdateDespesa(RelatorioDespesa despesa)
{
try
{
db.Entry(despesa).State = EntityState.Modified;
db.SaveChanges();
return 1;
}
catch { throw; }
}
//Obter uma despesa pelo seu id
public RelatorioDespesa GetDespesa(int id)
{
try
{
RelatorioDespesa despesa = db.RelatorioDespesas.Find(id);
return despesa;
}
catch{ throw; }
}
//Deletar uma despesa
public void DeleteDespesa(int id)
{
try
{
RelatorioDespesa desp = db.RelatorioDespesas.Find(id);
db.RelatorioDespesas.Remove(desp);
db.SaveChanges();
}
catch{ throw; }
}
//Calcula despesa semestral
public Dictionary<string, decimal> CalculaDespesaPeriodo(int periodo)
{
Dictionary<string, decimal> SomaDespesasPeriodo = new Dictionary<string,
decimal>();
decimal despAlimentacao = db.RelatorioDespesas.Where
(cat => cat.Categoria == "Alimentacao" && (cat.DataDespesa
>
DateTime.Now.AddMonths(-periodo)))
.Select(cat => cat.Valor)
.Sum();
decimal despCompras = db.RelatorioDespesas.Where
(cat => cat.Categoria == "Compras" && (cat.DataDespesa >
DateTime.Now.AddMonths(-periodo)))
.Select(cat => cat.Valor)
.Sum();
decimal despTransporte = db.RelatorioDespesas.Where
(cat => cat.Categoria == "Transporte" && (cat.DataDespesa >
DateTime.Now.AddMonths(-periodo)))
.Select(cat => cat.Valor)
.Sum();
decimal despSaude = db.RelatorioDespesas.Where
(cat => cat.Categoria == "Saude" && (cat.DataDespesa >
DateTime.Now.AddMonths(-periodo)))
.Select(cat => cat.Valor)
.Sum();
decimal despMoradia = db.RelatorioDespesas.Where
(cat => cat.Categoria == "Moradia" && (cat.DataDespesa >
DateTime.Now.AddMonths(-periodo)))
.Select(cat => cat.Valor)
.Sum();
decimal despLazer = db.RelatorioDespesas.Where
(cat => cat.Categoria == "Lazer" && (cat.DataDespesa >
DateTime.Now.AddMonths(-periodo)))
.Select(cat => cat.Valor)
.Sum();
SomaDespesasPeriodo.Add("Alimentacao", despAlimentacao);
SomaDespesasPeriodo.Add("Compras", despCompras);
SomaDespesasPeriodo.Add("Transporte", despTransporte);
SomaDespesasPeriodo.Add("Saude", despSaude);
SomaDespesasPeriodo.Add("Moradia", despMoradia);
SomaDespesasPeriodo.Add("Lazer", despLazer);
return SomaDespesasPeriodo;
}
//Calcula despesa mensal
public Dictionary<string, decimal> CalculaDespesaPeriodoSemanal(int
periodo)
{
Dictionary<string, decimal> SomaDespesasPeriodoSemanal = new
Dictionary<string, decimal>();
decimal despAlimentacao = db.RelatorioDespesas.Where
(cat => cat.Categoria == "Alimentacao" && (cat.DataDespesa
>
DateTime.Now.AddDays(-periodo)))
.Select(cat => cat.Valor)
.Sum();
decimal despCompras = db.RelatorioDespesas.Where
(cat => cat.Categoria == "Compras" && (cat.DataDespesa >
DateTime.Now.AddDays(-periodo)))
.Select(cat => cat.Valor)
.Sum();
decimal despTransporte = db.RelatorioDespesas.Where
(cat => cat.Categoria == "Transporte" && (cat.DataDespesa >
DateTime.Now.AddDays(-periodo)))
.Select(cat => cat.Valor)
.Sum();
decimal despSaude = db.RelatorioDespesas.Where
(cat => cat.Categoria == "Saude" && (cat.DataDespesa >
DateTime.Now.AddDays(-periodo)))
.Select(cat => cat.Valor)
.Sum();
decimal despMoradia = db.RelatorioDespesas.Where
(cat => cat.Categoria == "Moradia" && (cat.DataDespesa >
DateTime.Now.AddDays(-periodo)))
.Select(cat => cat.Valor)
.Sum();
decimal despLazer = db.RelatorioDespesas.Where
(cat => cat.Categoria == "Lazer" && (cat.DataDespesa >
DateTime.Now.AddDays(-periodo)))
.Select(cat => cat.Valor)
.Sum();
SomaDespesasPeriodoSemanal.Add("Alimentacao", despAlimentacao);
SomaDespesasPeriodoSemanal.Add("Compras", despCompras);
SomaDespesasPeriodoSemanal.Add("Transporte", despTransporte);
SomaDespesasPeriodoSemanal.Add("Saude", despSaude);
SomaDespesasPeriodoSemanal.Add("Moradia", despMoradia);
SomaDespesasPeriodoSemanal.Add("Lazer", despLazer);
return SomaDespesasPeriodoSemanal;
}
}
}
Nesta classe temos os métodos para realizar as operações CRUD
via Entity Framework Core onde usamos a injeção de
dependência para obter uma instância da classe de contexto.
using Microsoft.AspNetCore.Mvc;
using MinhasFinancas.DAL;
using MinhasFinancas.Models;
using System;
using System.Collections.Generic;
using System.Linq;
namespace MinhasFinancas.Controllers
{
public class DespesaController : Controller
{
private readonly IFinancasDAL _dal;
public DespesaController(IFinancasDAL dal)
{
_dal = dal;
}
// GET: Despesas
public IActionResult Index(string criterio)
{
var lstDespesas = _dal.GetAllDespesas().ToList();
if (!String.IsNullOrEmpty(criterio))
{
lstDespesas = _dal.GetFiltraDespesa(criterio).ToList();
}
return View(lstDespesas);
}
public ActionResult AddEditDespesa(int itemId)
{
RelatorioDespesa model = new RelatorioDespesa();
if (itemId > 0)
{
model = _dal.GetDespesa(itemId);
}
return PartialView("_despesaForm", model);
}
[HttpPost]
public ActionResult Create(RelatorioDespesa novaDespesa)
{
if (ModelState.IsValid)
{
if (novaDespesa.ItemId > 0)
{
_dal.UpdateDespesa(novaDespesa);
}
else
{
_dal.AddDespesa(novaDespesa);
}
}
return RedirectToAction("Index");
}
[HttpPost]
public IActionResult Delete(int id)
{
_dal.DeleteDespesa(id);
return RedirectToAction("Index");
}
public ActionResult DespesaResumo()
{
return PartialView ("_despesaReport");
}
public JsonResult GetDepesaPorPeriodo()
{
Dictionary<string, decimal> despesaPeriodo =
_dal.CalculaDespesaPeriodo(7);
return new JsonResult(despesaPeriodo);
}
public JsonResult GetDepesaPorPeriodoSemanal()
{
Dictionary<string, decimal> despesaPeriodoSemanal =
_dal.CalculaDespesaPeriodoSemanal(7);
return new JsonResult(despesaPeriodoSemanal);
}
}
}
http://www.macoratti.net/18/08/aspn_gfcg2.htm
Hoje vamos criar uma aplicação ASP .NET Core para fazer o
gerenciamento de despesas pessoais e exibir um gráfico das
despesas usando os recursos do Entity Framework Core 2.0 .
1. Index.cshtml
Esta view vai exibir todos os dados das despesas e contém
uma caixa de busca para um item particular e os botões
para Editar e Excluir uma despesa.
2. _despesaForm.cshtml
Esta é uma partial view que contém o formulário para
tratar a entrada do usuário. Ela será usasda para tratar as
funcionalidades de adicionar e editar e será exibida como
um diálogo modal.
3. _despesaReport.cshtml
É uma partial view que vai exibir um resumo das despesas
em um gráfico de barras usando os recursos
do HighCharts:
@model IEnumerable<MinhasFinancas.Models.RelatorioDespesa>
@{
ViewData["Title"] = "Gerenciandor de Finanças Pessoal";
}
<link href="~/lib/bootstrap/dist/css/bootstrap.css" rel="stylesheet" />
<script src="~/lib/jquery/dist/jquery.min.js"></script>
<script src="~/lib/bootstrap/dist/js/bootstrap.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/bootstrap-
datepicker/1.8.0/js/bootstrap-datepicker.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-
datepicker/1.8.0/css/bootstrap-datepicker.css" rel="stylesheet">
<h2>Minhas Finanças</h2>
<br />
<div>
<div style="float:left">
<button class="btn btn-primary" onclick=" AddEditDespesa(0)">Adicionar
Despesa</button>
<button class="btn btn-success" onclick=" ReportDespesa()">Relatório
Despesas</button>
</div>
<div style="float:right; width:40%;">
<form asp-controller="Despesa" asp-action="Index" class="form-group">
<div class="col-sm-6">
<input class="form-control" type="text" name="criterio"
placeholder="Procurar">
</div>
<button type="submit" class="btn btn-default btn-info">Filtrar</button>
</form>
</div>
</div>
<br />
<br />
<table class="table">
<thead>
<tr>
<th>@Html.DisplayNameFor(model => model.ItemId)</th>
<th>@Html.DisplayNameFor(model => model.ItemNome)</th>
<th>@Html.DisplayNameFor(model => model.Valor)</th>
<th>@Html.DisplayNameFor(model => model.DataDespesa)</th>
<th>@Html.DisplayNameFor(model => model.Categoria)</th>
<th>Action Item</th>
</tr>
</thead>
<tbody>
@foreach (var item in Model)
{
<tr>
<td>@Html.DisplayFor(modelItem => item.ItemId)</td>
<td>@Html.DisplayFor(modelItem => item.ItemNome)</td>
<td>@Html.DisplayFor(modelItem => item.Valor)</td>
<td>@Html.DisplayFor(modelItem => item.DataDespesa)</td>
<td>@Html.DisplayFor(modelItem => item.Categoria)</td>
<td>
<button class="btn btn-default"
onclick="AddEditDespesa(@item.ItemId)">Editar</button>
<button class="btn btn-danger"
onclick="DeleteDespesa(@item.ItemId)">Deletar</button>
</td>
</tr>
}
</tbody>
</table>
<div class="modal fade" id="despesaFormModel" role="dialog">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<a href="#" class="close" data-dismiss="modal">×</a>
<h3 id="title" class="modal-title">Adicionar Despesa</h3>
</div>
<div class="modal-body" id="despesaFormModelDiv">
</div>
</div>
</div>
</div>
<div class="modal fade" id="despesaReportModal" role="dialog">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<a href="#" class="close" data-dismiss="modal">×</a>
<h3 class="modal-title">Relatório de Despesas</h3>
</div>
<div class="modal-body" id="despesaReportModalDiv">
</div>
</div>
</div>
</div>
<script>
var AddEditDespesa = function (itemId) {
var url = "/Despesa/AddEditDespesa?itemId=" + itemId;
if (itemId > 0)
$('#title').html("Edita Despesa");
$("#despesaFormModelDiv").load(url, function () {
$("#despesaFormModel").modal("show");
});
$('#despesaFormModel').on('shown.bs.modal', function () {
$('#calender-container .input-group.date').datepicker({
todayBtn: true,
calendarWeeks: true,
todayHighlight: true,
format: 'dd/mm/yyyy',
autoclose: true,
container: '#despesaFormModel modal-body'
});
});
}
var ReportDespesa = function () {
var url = "/Despesa/DespesaResumo";
$("#despesaReportModalDiv").load(url, function () {
$("#despesaReportModal").modal("show");
})
}
var DeleteDespesa = function (itemId) {
var resp = confirm("Deseja deletar a despesa : " + itemId);
if (resp) {
$.ajax({
type: "POST",
url: "/Despesa/Delete/" + itemId,
success: function () {
window.location.href = "/Despesa/Index";
}
})
}
}
</script>
<script>
$('body').on('click', "#btnSubmit", function () {
var myformdata = $("#despesaForm").serialize();
$.ajax({
type: "POST",
url: "/Despesa/Create",
data: myformdata,
success: function () {
$("#myModal").modal("hide");
window.location.href = " /Despesa/Index";
},
error: function (errormessage) {
alert(errormessage.responseText);
}
})
})
</script>
A função ReportDespesa vai chamar o
método DespesaResumo em nosso controlador, que retornará a
partial view “_despesaReport” para ser exibida como um
diálogo modal. Essa view parcial vai exibir o gráfico de resumo
de despesas mensal e semanal usando o Highcharts.
@model MinhasFinancas.Models.RelatorioDespesa
<script src="//cdnjs.cloudflare.com/ajax/libs/bootstrap-
datepicker/1.3.0/js/bootstrap-datepicker.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-
datepicker/1.8.0/css/bootstrap-datepicker.css" rel="stylesheet">
<div>
<div class="row">
<div class="col-md-8">
<form id="despesaForm">
<input type="hidden" asp-for="ItemId" />
<div class="form-group">
<label asp-for=" ItemNome" class="control-label"></label>
<input asp-for=" ItemNome" class="form-control" />
</div>
<div class="form-group">
<label asp-for="Categoria" class="control-label"></label>
<select asp-for="Categoria" class="form-control">
<option value="">-- Selecione a Categoria --</option>
<option value="Alimentacao">Alimentação</option>
<option value="Compras">Compras</option>
<option value="Transporte">Transporte</option>
<option value="Saude">Saúde</option>
<option value="Moradia">Moradia</option>
<option value="Lazer">Lazer</option>
</select>
</div>
<div class="form-group">
<label asp-for="Valor" class="control-label"></label>
<input asp-for="Valor" class="form-control" />
</div>
<div class="form-group" id="calender-container">
<label asp-for=" DataDespesa" class="control-label"></label>
<div class="input-group date">
<input asp-for="DataDespesa" type="text" class="form-
control"><span class="input-group-addon">
<i class="glyphicon glyphicon-calendar"></i></span>
</div>
</div>
<div class="form-group">
<button type="button" id="btnSubmit" class="btn btn-block btn-
info">Salvar</button>
</div>
</form>
</div>
</div>
</div>
<script src="https://code.highcharts.com/highcharts.js"></script>
<button id="btnReportMensal" class="btn btn-info">Relatório Mensal</button>
<button id="btnReportSemanal" class="btn btn-warning">Relatório
Semanal</button>
<div id="container" style="min-width: 400px; height: 400px; margin: 0 auto"></div>
<script>
$(document).ready(function () {
$("#btnReportSemanal").click(function () {
var titulomensagem = "Despesa semanal : ";
$.ajax({
type: "GET",
url: "/Despesa/GetDepesaPorPeriodoSemanal",
contentType: "application/json",
dataType: "json",
success: function (result) {
var keys = Object.keys(result);
var datasemanal = new Array();
var totalgasto = 0.0;
for (var i = 0; i < keys.length; i++) {
var arrL = new Array();
arrL.push(keys[i]);
arrL.push(result[keys[i]]);
totalgasto += result[keys[i]];
datasemanal .push(arrL);
}
createCharts(datasemanal , titulomensagem ,
totalgasto.toFixed(2));
}
})
})
$("#btnReportMensal").click(function () {
var titulomensagem = "Despesa semestral : ";
$.ajax({
type: "GET",
url: "/Despesa/GetDepesaPorPeriodo",
contentType: "application/json",
dataType: "json",
success: function (result) {
var keys = Object.keys(result);
var datamensal = new Array();
var totalgasto = 0.0;
for (var i = 0; i < keys.length; i++) {
var arrL = new Array();
arrL.push(keys[i]);
arrL.push(result[keys[i]]);
totalgasto += result[keys[i]];
datamensal .push(arrL);
}
createCharts(datamensal , titulomensagem ,
totalgasto.toFixed(2));
}
})
})
})
function createCharts(soma, tituloTexto, totalgasto) {
Highcharts.chart('container', {
chart: {
type: 'column'
},
title: {
text: tituloTexto + ' ' + totalgasto
},
xAxis: {
type: 'category',
labels: {
rotation: -45,
style: {
fontSize: '13px',
fontFamily: 'Verdana, sans-serif'
}
}
},
yAxis: {
min: 0,
title: {
text: 'Valor Despesas'
}
},
legend: {
enabled: false
},
tooltip: {
pointFormat: 'Total despesas: <b>{point.y:.2f} </b>'
},
series: [{
type: 'column',
data: soma,
}]
});
}
</script>
...
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Despesa}/{action=Index}/{id?}");
});
...
Agora é só alegria...
Neste
artigo eu
vou
mostrar
como criar
uma
aplicação
ASP .NET
Core MVC
usando o
VS 2017
recordand
o os
conceitos
da
implement
ação
ASP .NET
MVC.
Exemplos:
- http://localhost:1234/Home/About tem dados de rota
de Home(o controlador) e About(o método Action para chamar o
controlador Home).
- http://localhost:1234/Filme/Edit/5 é uma solicitação para
editar o filme com ID igual a 5 usando o controlador Filme.
using Microsoft.AspNetCore.Mvc;
namespace MvcFilme.Controllers
{
public class OlaMundoController : Controller
{
//
// GET: /OlaMundo/
public string Index()
{
return "Este é a Action padrão (Index)...";
}
//
// GET: /OlaMundo/BemVindo/
public string BemVindo()
{
return "Este é um método Action BemVindo...";
}
}
}
/[Controller]/[ActionName]/[Parameters]
A definição desse formato esta definido no arquivo Startup.cs :
...
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template:
"{controller=Home}/{action=Index}/{id?}");
});
.....
...
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template:
"{controller=Home}/{action=Index}/ {id?}");
});
.....
//
// GET: /OlaMundo/
public IActionResult Index()
{
return View();
}
@{
ViewData["Title"] = "Index";
}
<h2>Macoratti .net - Index</h2>
<hr />
<p> Um alô da View Template !</p>
O método Action Index() do
controlador OlaMundoController agora retornou uma View e
não uma string.
Neste
artigo
eu vou
mostra
r como
criar
uma
aplicaç
ão ASP
.NET
Core
MVC
usando
o VS
2017.
Nota: Se você não conheçe o Razor e sua sintaxe sugiro que leia
este artigo : ASP .NET - Apresentando a sintaxe Razor - Macoratti
@inject
Microsoft.ApplicationInsights.AspNetCore.JavaScriptSnippet
JavaScriptSnippet
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width,
initial-scale=1.0" />
<title>@ViewData["Title"] - Aplicação Filmes</title>
<environment names="Development">
<link rel="stylesheet"
href="~/lib/bootstrap/dist/css/bootstrap.css" />
<link rel="stylesheet" href="~/css/site.css" />
</environment>
<environment names="Staging,Production">
<link rel="stylesheet"
href="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.7/css/boots
trap.min.css"
asp-fallback-
href="~/lib/bootstrap/dist/css/bootstrap.min.css"
asp-fallback-test-class="sr-only" asp-fallback-test-
property="position" asp-fallback-test-value="absolute" />
<link rel="stylesheet" href="~/css/site.min.css" asp-
append-version="true" />
</environment>
@Html.Raw(JavaScriptSnippet.FullScript)
</head>
<body>
<nav class="navbar navbar-inverse navbar-fixed-top">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-
toggle="collapse" data-target=".navbar-collapse">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
@*<a asp-area="" asp-controller="Home" asp-
action="Index" class="navbar-brand">MvcFilme</a>*@
<a asp-area="" asp-controller="Filmes" asp-
action="Index" class="navbar-brand">Filmes do Macoratti</a>
</div>
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li><a asp-area="" asp-controller="Home" asp-
action="Index">Home</a></li>
<li><a asp-area="" asp-controller="Home" asp-
action="About">Sobre</a></li>
<li><a asp-area="" asp-controller="Home" asp-
action="Contact">Contato</a></li>
</ul>
</div>
</div>
</nav>
<div class="container body-content">
@RenderBody()
<hr />
<footer>
<p>© 2017 - Macoratti .net - MvcFilme</p>
</footer>
</div>
<environment names="Development">
<script src="~/lib/jquery/dist/jquery.js"></script>
<script src="~/lib/bootstrap/dist/js/bootstrap.js"></script>
<script src="~/js/site.js" asp-append-version="true"></script>
</environment>
<environment names="Staging,Production">
<script src="https://ajax.aspnetcdn.com/ajax/jquery/jquery-
2.2.0.min.js"
asp-fallback-src="~/lib/jquery/dist/jquery.min.js"
asp-fallback-test="window.jQuery"
crossorigin="anonymous"
integrity="sha384-
K+ctZQ+LL8q6tP7I94W+qzQsfRV2a+AfHIi9k8z8l9ggpc8X+Ytst4yBo/hH
+8Fk">
</script>
<script
src="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.7/bootstrap.min.js"
asp-fallback-src="~/lib/bootstrap/dist/js/bootstrap.min.js"
asp-fallback-test="window.jQuery && window.jQuery.fn &&
window.jQuery.fn.modal"
crossorigin="anonymous"
integrity="sha384-
Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNI
cPD7Txa">
</script>
<script src="~/js/site.min.js" asp-append-
version="true"></script>
</environment>
@RenderSection("Scripts", required: false)
</body>
</html>
Alterações feitas:
@{
Layout = "_Layout";
}
Esse arquivo é usado para definir a página padrão de leaiute
para a aplicação. Ele inclui o arquivo _Layout.cshtml em cada
view usando a propriedade Layout.
Nota: Para saber mais sobre como funciona esse arquivo leia esse
artigo: ASP .NET MVC - Diferentes maneiras de renderizar
layouts - Macoratti
@{
ViewData["Title"] = "Lista de Filmes";
}
<h1>Minha lista de Filmes</h1>
<hr />
<p> Um alô da View OlaMundo\Index.cshtml !</p>
Neste
artigo
eu vou
mostra
r como
criar
uma
aplicaç
ão ASP
.NET
Core
MVC
usando
o VS
2017.
Nota: Se você não conheçe o Razor e sua sintaxe sugiro que leia
este artigo : ASP .NET - Apresentando a sintaxe Razor - Macoratti
Atualmente, o método BemVindo na
classe OlaMundoController toma um nome e um parâmetro
ID e, em seguida, exibe diretamente os valores de saída para o
navegador.
using Microsoft.AspNetCore.Mvc;
namespace MvcFilme.Controllers
{
public class OlaMundoController : Controller
{
public IActionResult Index()
{
return View();
}
public IActionResult BemVindo(string nome, int
NumVezes)
{
ViewData["Mensagem"] = "Olá " + nome;
ViewData["NumVezes"] = NumVezes;
return View();
}
}
}
Bem, ainda não criamos a view. Mas sabemos que temos que
criar uma view na pasta Views/OlaMundo com o
nome BemVindo.cshtml porque esta é a convenção padrão que
o Framework MVC adota :
De forma geral, se você deseja retornar uma view para uma ação
do controlador, então você vai precisar criar uma subpasta na
pasta Views com o mesmo nome do controlador , e, no interior
da subpasta você deverá criar uma View com o mesmo nome da
ação do controlador.
@{
ViewData["Title"] = "Bem-Vindo";
}
<h2>Macoratti .net - Seja Bem-Vindo</h2>
<ul>
@for (int i = 0; i < (int)ViewData["NumVezes"]; i++)
{
<li>@ViewData["Mensagem"]</li>
}
</ul>
Nota: O Model Binding funciona assim : Quando MVC recebe uma solicitação
HTTP, ele roteia a requisição para um método de Action específico de um
controlador. Ele determina qual método Action deve ser executado com base
no que está nos dados da rota, e então vincula valores da solicitação HTTP aos
parâmetros desse método Action.
Criando um controlador
Agora clique com o botão direito do mouse sobre a
pasta Controllers, e a seguir clique em Add -> Controller;
"Microsoft.VisualStudio.web.CodeGeneration.Tools"
"Microsoft.EntityFrameworkCore.Tools.DotNet"
dotnet restore
dotnet ef migrations add Initial
dotnet ef database update
Testando a aplicação
Executando a aplicação e clicando no link - Filmes do
macoratti :
Será aberta a página de filmes vazia pois não temos nenhum
filme cadastrado ainda. Clique no link Create New:
....
// This method gets called by the runtime. Use this method to
add services to the container.
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddMvc();
services.AddDbContext<MvcFilmeContext>(options
=>
options.UseSqlServer(Configuration.GetConnectionString("M
vcFilmeContext")));
}
....
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using MvcFilme.Models;
using System.Linq;
using System.Threading.Tasks;
namespace MvcFilme.Controllers
{
public class FilmesController : Controller
{
private readonly MvcFilmeContext _context;
public FilmesController(MvcFilmeContext context)
{
_context = context;
}
.....
// GET: Filmes/Details/5
public async Task<IActionResult> Details(int? id)
{
if (id == null)
{
return NotFound();
}
var filme = await _context.Filme
.SingleOrDefaultAsync(m => m.ID == id);
if (filme == null)
{
return NotFound();
}
return View(filme);
}
@model MvcFilme.Models.Filme
@{
ViewData["Title"] = "Details";
}
<h2>Details</h2>
<div>
<h4>Filme</h4>
<hr />
<dl class="dl-horizontal">
<dt>
@Html.DisplayNameFor(model => model.Titulo)
</dt>
<dd>
@Html.DisplayFor(model => model.Titulo)
</dd>
<dt>
@Html.DisplayNameFor(model => model.Lancamento)
</dt>
<dd>
@Html.DisplayFor(model => model.Lancamento)
</dd>
<dt>
@Html.DisplayNameFor(model => model.Genero)
</dt>
<dd>
@Html.DisplayFor(model => model.Genero)
</dd>
<dt>
@Html.DisplayNameFor(model => model.Preco)
</dt>
<dd>
@Html.DisplayFor(model => model.Preco)
</dd>
</dl>
</div>
<div>
<a asp-action="Edit" asp-route-id="@Model.ID">Edit</a> |
<a asp-action="Index">Back to List</a>
</div>
// GET: Filmes
public async Task<IActionResult> Index()
{
return View(await _context.Filme.ToListAsync());
}
Observe como o código cria um objeto List quando ele chama o
método View. O código passa esta lista de Filmes a partir do
método Action Index para a view Index.cshtml vista a seguir:
@model IEnumerable<MvcFilme.Models.Filme>
@{
ViewData["Title"] = "Index";
}
<h2>Index</h2>
<p>
<a asp-action="Create">Create New</a>
</p>
<table class="table">
<thead>
<tr>
<th>
@Html.DisplayNameFor(model => model.Titulo)
</th>
<th>
@Html.DisplayNameFor(model =>
model.Lancamento)
</th>
<th>
@Html.DisplayNameFor(model => model.Genero)
</th>
<th>
@Html.DisplayNameFor(model => model.Preco)
</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.Titulo)
</td>
<td>
@Html.DisplayFor(modelItem => item.Lancamento)
</td>
<td>
@Html.DisplayFor(modelItem => item.Genero)
</td>
<td>
@Html.DisplayFor(modelItem => item.Preco)
</td>
<td>
<a asp-action="Edit" asp-route-
id="@item.ID">Edit</a> |
<a asp-action="Details" asp-route-
id="@item.ID">Details</a> |
<a asp-action="Delete" asp-route-
id="@item.ID">Delete</a>
</td>
</tr>
}
</tbody>
</table>
Neste
artigo
eu vou
mostra
r como
criar
uma
aplicaç
ão ASP
.NET
Core
MVC
usando
o VS
2017.
....
// This method gets
called by the runtime.
Use this method to
add services to the
container.
public void
ConfigureServices(IS
erviceCollection
services)
{
// Add
framework services.
services.AddMvc();
services.AddDbConte
xt<MvcFilmeContext
>(options =>
options.UseSqlServer
(Configuration.GetC
onnectionString("Mv
cFilmeContext")));
}
....
{
"Logging": {
"IncludeScopes": false,
"LogLevel": {
"Default": "Warning"
}
},
"ConnectionStrings": {
"MvcFilmeContext":
"Server=(localdb)\\mssqllocaldb;Database=MvcFilmeCo
ntext-af418162-dae9-452f-a5a1-
6d6e066cfacc;Trusted_Connection=True;MultipleActiveR
esultSets=true"
}
}
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Linq;
namespace MvcFilme.Models
{
public class SeedData
{
public static void Initialize(IServiceProvider
serviceProvider)
{
using (var context = new MvcFilmeContext(
serviceProvider.GetRequiredService<DbContextOptions<MvcFil
meContext>>()))
{
// porcura por filmes
if (context.Filme.Any())
{
return; //DB foi alimentado
}
context.Filme.AddRange(
new Filme
{
Titulo = "A Bela e a Fera",
Lancamento = DateTime.Parse("2017-3-16"),
Genero = "Fantasia/Romance",
Preco = 7.99M
},
new Filme
{
Titulo = "Caça-Fantasmas",
Lancamento = DateTime.Parse("1984-3-13"),
Genero = "Comedia",
Preco = 8.99M
},
new Filme
{
Titulo = "Kong - A ilha da Caveira",
Lancamento = DateTime.Parse("2017-3-09"),
Genero = "Ficção",
Preco = 9.99M
},
new Filme
{
Titulo = "Rio Bravo",
Lancamento = DateTime.Parse("1959-4-15"),
Genero = "Western",
Preco = 3.99M
}
);
context.SaveChanges();
}
}
}
}
......
// This method gets called by the runtime. Use this method
to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app,
IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseBrowserLink();
}
else
{
app.UseExceptionHandler("/Home/Error");
}
app.UseStaticFiles();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template:
"{controller=Home}/{action=Index}/{id?}");
});
SeedData.Initialize(app.ApplicationServices);
}
......
Neste
artigo
eu vou
mostra
r como
criar
uma
aplicaç
ão ASP
.NET
Core
MVC
usando
o VS
2017.
using System;
using System.ComponentModel.DataAnnotations;
namespace MvcFilme.Models
{
public class Filme
{
public int ID { get; set; }
public string Titulo { get; set; }
[Display(Name = "Gênero")]
public string Genero { get; set; }
[Display(Name = "Preço")]
public decimal Preco { get; set; }
}
}
Veja também que cada filme exibe links para realizar a edição do
filme, exibir os detalhes do filme e deletar o filme no final da
linha de cada filme.
...
</td>
<td>
@Html.DisplayFor(modelItem => item.Genero)
</td>
<td>
@Html.DisplayFor(modelItem => item.Preco)
</td>
<td>
<a asp-action="Edit" asp-route-
id="@item.ID">Edit</a> |
<a asp-action="Details" asp-route-
id="@item.ID">Details</a> |
<a asp-action="Delete" asp-route-
id="@item.ID">Delete</a>
</td>
</tr>
}
</tbody>
</table>
....
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template:
"{controller=Home}/{action=Index}/{id?}");
});
SeedData.Initialize(app.ApplicationServices);
}
}
}
// GET: Filmes/Edit/5
public async Task<IActionResult> Edit(int? id)
{
if (id == null)
{
return NotFound();
}
var filme = await _context.Filme.SingleOrDefaultAsync(m
=> m.ID == id);
if (filme == null)
{
return NotFound();
}
return View(filme);
}
// POST: Filmes/Edit/5
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(int id,
[Bind("ID,Titulo,Lancamento,Genero,Preco")] Filme filme)
{
if (id != filme.ID)
{
return NotFound();
}
if (ModelState.IsValid)
{
try
{
_context.Update(filme);
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!FilmeExists(filme.ID))
{
return NotFound();
}
else
{
throw;
}
}
return RedirectToAction("Index");
}
return View(filme);
}
@model MvcFilme.Models.Filme
@{
ViewData["Title"] = "Edit";
}
<h2>Edit</h2>
<form asp-action="Edit">
<div class="form-horizontal">
<h4>Filme</h4>
<hr />
<div asp-validation-summary="ModelOnly" class="text-
danger"></div>
<input type="hidden" asp-for="ID" />
<div class="form-group">
<label asp-for="Titulo" class="col-md-2 control-
label"></label>
<div class="col-md-10">
<input asp-for="Titulo" class="form-control" />
<span asp-validation-for="Titulo" class="text-
danger"></span>
</div>
</div>
<div class="form-group">
<label asp-for="Lancamento" class="col-md-2 control-
label"></label>
<div class="col-md-10">
<input asp-for="Lancamento" class="form-
control" />
<span asp-validation-for="Lancamento" class="text-
danger"></span>
</div>
</div>
<div class="form-group">
<label asp-for="Genero" class="col-md-2 control-
label"></label>
<div class="col-md-10">
<input asp-for="Genero" class="form-control" />
<span asp-validation-for="Genero" class="text-
danger"></span>
</div>
</div>
<div class="form-group">
<label asp-for="Preco" class="col-md-2 control-
label"></label>
<div class="col-md-10">
<input asp-for="Preco" class="form-control" />
<span asp-validation-for="Preco" class="text-
danger"></span>
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Save" class="btn btn-
default" />
</div>
</div>
</div>
</form>
<div>
<a asp-action="Index">Back to List</a>
</div>
@section Scripts {
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}
// POST: Filmes/Edit/5
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(int id,
[Bind("ID,Titulo,Lancamento,Genero,Preco")] Filme filme)
{
if (id != filme.ID)
{
return NotFound();
}
if (ModelState.IsValid)
{
try
{
_context.Update(filme);
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!FilmeExists(filme.ID))
{
return NotFound();
}
else
{
throw;
}
}
return RedirectToAction("Index");
}
return View(filme);
}
Todos os métodos HttpGet em FilmesController seguem um
padrão semelhante. Eles obtêm um objeto filme (ou lista de
objetos, no caso de Index) e passam o objeto (modelo) para a
view.
Neste
artigo
eu vou
mostra
r como
criar
uma
aplicaç
ão ASP
.NET
Core
MVC
usando
o VS
2017.
// GET: Filmes
public async Task<IActionResult> Index(string
criterioBusca)
{
var filmes = from m in _context.Filme
select m;
if (!String.IsNullOrEmpty(criterioBusca))
{
filmes = filmes.Where(f =>
f.Titulo.Contains(criterioBusca));
}
return View(await filmes.ToListAsync());
}
if (!String.IsNullOrEmpty(searchString))
{
filmes = filmes.Where(s =>
s.Titulo.Contains(searchString));
}
....
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template:
"{controller=Home}/{action=Index}/{id?}");
});
....
// GET: Filmes
public async Task<IActionResult> Index(string id)
{
var filmes = from m in _context.Filme
select m;
if (!String.IsNullOrEmpty(id))
{
filmes = filmes.Where(f => f.Titulo.Contains(id));
}
return View(await filmes.ToListAsync());
}
Fica muito mais elegante mas não seria viável ficar passando as
informações modificando a URL, então vamos adicionar na
view Index.cshtml uma caixa de busca para nos ajudar a filtrar
os filmes pelo critério.
// GET: Filmes
public async Task<IActionResult> Index(string
criterioBusca)
{
var filmes = from m in _context.Filme
select m;
if (!String.IsNullOrEmpty(criterioBusca))
{
filmes = filmes.Where(f =>
f.Titulo.Contains(criterioBusca));
}
return View(await filmes.ToListAsync());
}
@model IEnumerable<MvcFilme.Models.Filme>
@{
ViewData["Title"] = "Index";
}
<h2>Filmes</h2>
<p>
<a asp-action="Create">Criar Novo</a>
</p>
<form asp-controller="Filmes" asp-action="Index">
<p>
Title: <input type="text" name="criterioBusca">
<input type="submit" value="Filtrar" />
</p>
</form>
...
using Microsoft.AspNetCore.Mvc.Rendering;
using System.Collections.Generic;
namespace MvcFilme.Models
{
public class FilmeGeneroViewModel
{
public List<Filme> filmes;
public SelectList generos;
public string filmeGenero { get; set; }
}
}
A nossa View Model contém:
Essa classe será usada como nosso Model para retornar a lista de
filmes e lista de gêneros para exibição na view Index.
// GET: Filmes
public async Task<IActionResult> Index(string
filmeGenero,string criterioBusca)
{
IQueryable<string> consultaGenero = from m in
_context.Filme
orderby m.Genero
select m.Genero;
var filmes = from m in _context.Filme
select m;
if (!String.IsNullOrEmpty(criterioBusca))
{
filmes = filmes.Where(s =>
s.Titulo.Contains(criterioBusca));
}
if (!String.IsNullOrEmpty(filmeGenero))
{
filmes = filmes.Where(x => x.Genero ==
filmeGenero);
}
var filmeGeneroVM = new FilmeGeneroViewModel();
filmeGeneroVM.generos = new SelectList(await
consultaGenero.Distinct().ToListAsync());
filmeGeneroVM.filmes = await filmes.ToListAsync();
return View(filmeGeneroVM);
}
if (!String.IsNullOrEmpty(filmeGenero))
{
filmes = filmes.Where(x => x.Genero ==
filmeGenero);
}
Neste
artigo
eu vou
mostra
r como
criar
uma
aplicaç
ão ASP
.NET
Core
MVC
usando
o VS
2017.
Dê um Build (CTRL+SHIFT+B) na Solution.
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult>
Create([Bind("ID,Titulo,Lancamento,Genero,Preco,Classificacao")
] Filme filme)
....
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(int id,
[Bind("ID,Titulo,Lancamento,Genero,Preco,Classificacao")] Filme
filme)
....
.....
</th>
<th>
@Html.DisplayNameFor(model =>
model.filmes[0].Classificacao)
</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach (var item in Model.filmes) {
<tr>
....
<td>
@Html.DisplayFor(modelItem => item.Preco)
</td>
<td>
@Html.DisplayFor(modelItem =>
item.Classificacao)
</td>
....
Nota:
.....
context.Filme.AddRange(
new Filme
{
Titulo = "A Bela e a Fera",
Classificacao="L",
Lancamento = DateTime.Parse("2017-3-16"),
Genero = "Fantasia/Romance",
Preco = 7.99M
},
....
Neste
artigo
eu vou
mostra
r como
criar
uma
aplicaç
ão ASP
.NET
Core
MVC
usando
o VS
2017.
using System;
using System.ComponentModel.DataAnnotations;
namespace MvcFilme.Models
{
public class Filme
{
public int ID { get; set; }
[StringLength(60, MinimumLength = 3)]
[Required]
public string Titulo { get; set; }
[Display(Name = "Data de Lançamento")]
[DataType(DataType.Date)]
public DateTime Lancamento { get; set; }
[RegularExpression(@"^[A-Z]+[a-zA-Z''-'\s]*$")]
[Required]
[StringLength(30)]
[Display(Name = "Gênero")]
public string Genero { get; set; }
[Range(1, 100)]
[DataType(DataType.Currency)]
[Display(Name = "Preço")]
public decimal Preco { get; set; }
[RegularExpression(@"^[A-Z]+[a-zA-Z''-'\s]*$")]
[StringLength(5)]
[Required]
public string Classificacao { get; set; }
}
}
// GET: Filmes/Create
public IActionResult Create()
{
return View();
}
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult>
Create([Bind("ID,Titulo,Lancamento,Genero,Preco,Classificacao")]
Filme filme)
{
if (ModelState.IsValid)
{
_context.Add(filme);
await _context.SaveChangesAsync();
return RedirectToAction("Index");
}
return View(filme);
}
...
<form asp-action="Create">
<div class="form-horizontal">
<h4>Filme</h4>
<hr />
<div asp-validation-summary="ModelOnly"
class="text-danger"></div>
<div class="form-group">
<label asp-for="Titulo" class="col-md-2 control-
label"></label>
<div class="col-md-10">
<input asp-for="Titulo" class="form-control" />
<span asp-validation-for="Titulo" class="text-
danger"></span>
</div>
</div>
<div class="form-group">
<label asp-for="Classificacao" class="col-md-2 control-
label"></label>
<div class="col-md-10">
<input asp-for="Titulo" class="form-control" />
<span asp-validation-for="Classificacao"
class="text-danger"></span>
</div>
</div>
...
O
namespace System.ComponentModel.DataAnnotations fornec
e atributos de formatação para além do conjunto incorporado de
atributos de validação.
...
[Display(Name = "Data de Lançamento")]
[DisplayFormat(DataFormatString = "{0:dd-MM-yyyy}",
ApplyFormatInEditMode = true)]
[DataType(DataType.Date)]
public DateTime Lancamento { get; set; }
...
A configuração ApplyFormatInEditMode especifica que a
formatação também deve ser aplicada quando o valor é exibido
em uma caixa de texto para edição. (Talvez você não queira
aplicar isso para alguns campos - por exemplo, para valores de
moeda, você provavelmente não vai querer o símbolo de moeda
na caixa de texto para edição.)
Neste
artigo
eu vou
mostra
r como
criar
uma
aplicaç
ão ASP
.NET
Core
MVC
usando
o VS
2017.
// GET: Filmes/Details/5
public async Task<IActionResult> Details(int? id)
{
if (id == null)
{
return NotFound();
}
var filme = await _context.Filme
.SingleOrDefaultAsync(m => m.ID == id);
if (filme == null)
{
return NotFound();
}
return View(filme);
}
...
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
...
// GET: Filmes/Delete/5
public async Task<IActionResult> Delete(int? id)
{
if (id == null)
{
return NotFound();
}
var filme = await _context.Filme
.SingleOrDefaultAsync(m => m.ID == id);
if (filme == null)
{
return NotFound();
}
return View(filme);
}
// POST: Filmes/Delete/5
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> DeleteConfirmed(int id)
{
var filme = await _context.Filme.SingleOrDefaultAsync(m
=> m.ID == id);
_context.Filme.Remove(filme);
await _context.SaveChangesAsync();
return RedirectToAction("Index");
}
Observe que o método HTTP GET Delete não exclui o filme
especificado, ele retorna uma view do filme onde você pode
submeter(HttpPost) a exclusão. Executar uma operação de
exclusão em resposta a uma solicitação GET (ou executar uma
operação de edição, ou criação ou qualquer outra operação que
altera dados) abre um buraco de segurança.
// POST: Movies/Delete/6
[ValidateAntiForgeryToken]
public async Task<IActionResult> Delete(int id, bool notUsed)
Neste
artigo eu
vou
mostrar
como
configurar
o seu
ambiente
para
desenvovl
er
aplicações
ASP .NET
Core.
- ASP .NET 5 - Não existe mais , foi um nome usado para
identificar o que hoje é conhecido como ASP .NET Core.
- ASP .NET Core 1.0 - É a versão estável da ASP .NET Core com
suporte da Microsoft e que deve ser usada para aplicações de
produção; (Nessa versão a solução usa o arquivo de projeto do
tipo project.json.)
- ASP .NET Core 1.1 - É a versão atual da ASP .NET Core e esta
em desenvolvimento. (Nessa versão a solução usa o arquivo de
projeto do tipo .csproj)
Configurando o ambiente de
desenvolvimento para ASP NET Core
1.1
1- Vou desenvolver para o ambiente
Windows
Acesse o site oficial da .NET Core no
endereço : http://www.microsoft.com/net/core
C# for
Visual
Studio Code
(powered
by
OmniSharp)
C#
Extensions
Auto
Import
vscod
e-icons
Para mais
detalhes
sobre
o Visual
Studio
Code (VS
Code) leia
o artigo :
Visual
Studio
Code - O
Editor
multiplataf
orma da
Microsoft -
Macoratti
1. Usar o Yeoman
node -v
npm -v
O código da classe Aluno é :
O código da classe Endereco é :
public class AlunoViewItem
{
public string Nome { get; set; }
public string Email { get; set; }
public string Endereco { get; set; }
public string Genero { get; set; }
public int Idade { get; set; }
public string Nascimento { get; set; }
}
AlunoViewItem viewItem = new AlunoViewItem();
viewItem.Nome = aluno.Nome;
viewItem.Email = aluno.Email;
viewItem.Endereco = aluno.Endereco.Cidade +
aluno.Endereco.Rua;
viewItem.Genero = aluno.Genero == true ? "Masculino" :
"Feminino";
viewItem.Idade = aluno.Idade;
viewItem.Nascimento = aluno.Nascimento.ToShortDateString();
Então, ao trabalho...
Recursos usados :
using System;
namespace CSharp_AutoMapper
{
public class Aluno
{
public string Nome { get; set; }
public string Email { get; set; }
public Endereco Endereco { get; set; }
public bool Genero { get; set; }
public int Idade { get; set; }
public DateTime Nascimento { get; set; }
}
}
using AutoMapper;
Mapper.CreateMap<Aluno, AlunoViewItem>();
AlunoViewItem _alunoViewItem
= Mapper.Map<Aluno, Aluno>(aluno);
Mapper.CreateMap<Aluno, AlunoViewItem>()
.ForMember(dest => dest.Endereco, m => m.MapFrom(a =>
a.Endereco.Cidade + ", " + a.Endereco.Rua));
ListBox - name=lbDados
Button - name=btnCriarMapeamento
using System;
using System.Windows.Forms;
using AutoMapper;
lbDados.Items.Add(_alunoViewItem.Nome);
lbDados.Items.Add(_alunoViewItem.Email);
lbDados.Items.Add(_alunoViewItem.Endereco);
lbDados.Items.Add(_alunoViewItem.Genero);
lbDados.Items.Add(_alunoViewItem.Nascimento);
lbDados.Items.Add(_alunoViewItem.Idade);
}
C#
lbDados.Items.Add(_alunoViewItem.Nome)
lbDados.Items.Add(_alunoViewItem.Email)
lbDados.Items.Add(_alunoViewItem.Endereco)
lbDados.Items.Add(_alunoViewItem.Genero)
lbDados.Items.Add(_alunoViewItem.Nascimento)
lbDados.Items.Add(_alunoViewItem.Idade)
http://www.macoratti.net/19/04/aspc_autom1.htm
public class
public class Usuario
UsuarioViewModel
{
{
public string Nome { get; set; }
public string
public string Email { get; set; }
Nome { get; set; }
public int Idade { get; set; }
public string
public DateTime Nascimento { get; set; }
Email { get; set; }
}
}
Recursos usados :
Configurando o AutoMapper
Para poder usar o AutoMapper temos que incluir o pacote Nuget
em nosso projeto.
.....
public
void
ConfigureServ
ices(IServiceC
ollection
services)
{
services.Confi
gure<CookiePo
licyOptions>(o
ptions =>
{
options.Check
ConsentNeede
d = context =>
true;
options.Minim
umSameSitePo
licy =
SameSiteMode
.None;
});
services.AddM
vc().SetCompa
tibilityVersion
(Compatibility
Version.Versio
n_2_1);
var
config = new
AutoMapper.
MapperConfig
uration(cfg
=>
{
cfg.CreateMa
p<UsuarioVie
wModel,
Models.Usuari
o>();
});
IMapper
mapper =
config.Create
Mapper();
services.AddS
ingleton(map
per);
}
....
using AspCore_AutoMapper.Models;
using AutoMapper;
using Microsoft.AspNetCore.Mvc;
using System.Diagnostics;
namespace AspCore_AutoMapper.Controllers
{
public class HomeController : Controller
{
IMapper _mapper;
public HomeController(IMapper mapper)
{
_mapper = mapper;
}
public IActionResult Index()
{
var usuario = new Usuario
{
Nome = "Macoratti",
Email = "macoratti@yahoo.com"
};
var viewModel =
_mapper.Map<UsuarioViewModel>(usuario);
return View(viewModel);
}
public IActionResult About()
{}
public IActionResult Contact()
{}
...
...
}
}
ASP .NET Core - Criando uma app Básica com EF Core , Web API
e Angular 2
http://www.macoratti.net/17/06/aspncore_ang2.htm
Para criar o projeto ASP .NET Core com Angular 2 vamos usar
o Yeoman, depois vamos definir o nosso Modelo de domínio,
incluir o Entity Framework Core, criar o banco de dados usando
o Migrations, criar a Web API de serviços e ao final integrar
o Angular 2 para consumir o serviço e exibir as informações no
cliente em um formulário com recursos do Bootstrap.
Recursos usados:
Para o artigo eu vou criar uma pasta chamada Alfa : md alfa
- ClienteApp - local
onde teremos o código
do lado do cliente
definido pelo Angular
2;
- Controllers - local
onde são criados os
controladores Asp
.Net Core. Aqui
iremos criar nossa
Web API;
- node_modules -
contém das
dependências para o
Angular 2;
- wwwroot - pasta
onde são colocados os
arquivos públicos e
estáticos da aplicação
: ícones, imagens,
fontes, etc.;
Startup.cs -
classe que
processa o
pipeline de
requisições que
trata todas as
requisições
feitas para a
aplicação;
Program.cs -
Contém o
ponto de
entrada
principal do
aplicativo;
Alfa.csproj - O
arquivo de
projeto para a
ASP .NET Core
Web API;
appsettings.js
on - Arquivo de
configuração
do aplicativo
de base do
ambiente;
tsconfig.json -
configuração
para o
TypeScript;
1- Classe Marca
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel.DataAnnotations;
namespace Alfa.Models
{
public class Marca
{
public int Id {get; set; }
[Required]
[StringLength(255)]
public string Nome {get;set;}
public ICollection<Modelo> Modelos {get;set;}
public Marca()
{
Modelos = new Collection<Modelo>();
}
}
}
2- Classe Modelo
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace Alfa.Models
{
[Table("Modelos")]
public class Modelo
{
public int Id { get; set; }
[Required]
[StringLength(255)]
public string Nome { get; set; }
public Marca Marca { get; set; }
public int MarcaId { get; set; }
}
}
3- Classe Acessorio
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace Alfa.Models
{
[Table("Acessorios")]
public class Acessorio
{
public int Id { get; set; }
[Required]
[StringLength(255)]
public string Nome { get; set; }
}
}
4- Classe AlfaDbContext
using Alfa.Models;
using Microsoft.EntityFrameworkCore;
namespace Alfa.Models
{
public class AlfaDbContext : DbContext
{
public AlfaDbContext(DbContextOptions<AlfaDbContext> options)
: base (options)
{}
public DbSet<Marca> Marcas { get; set; }
public DbSet<Acessorio> Acessorios { get; set; }
}
}
using Microsoft.EntityFrameworkCore;
using Alfa.Models;
...
....
// This method gets called by the runtime. Use this method to add services to
the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<AlfaDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("ConexaoAlfa")));
{ "ConnectionStrings" : {
"ConexaoAlfa" :
"Server=(localdb)\\mssqllocaldb;Database=Alfa;Trusted_Connection=True;Mu
ltipleActiveResultSets=true;"
},
"Logging": {
"IncludeScopes": false,
"LogLevel": {
"Default": "Debug",
"System": "Information",
"Microsoft": "Information"
}
}
}
A string de conexão especifica um banco de dados identificado
pelo nome Alfa.
using System;
using System.Collections.Generic;
using Microsoft.EntityFrameworkCore.Migrations;
namespace Alfa.Migrations
{
public partial class SeedDatabase : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
//Marcas
migrationBuilder.Sql("INSERT INTO Marcas (Nome) VALUES ('Ford')");
migrationBuilder.Sql("INSERT INTO Marcas (Nome) VALUES ('GM')");
migrationBuilder.Sql("INSERT INTO Marcas (Nome) VALUES ('Honda')");
//Modelos
migrationBuilder.Sql("INSERT INTO Modelos (Nome, MarcaId) VALUES
('Fiesta', (SELECT Id FROM Marcas Where Nome= 'Ford'))");
migrationBuilder.Sql("INSERT INTO Modelos (Nome, MarcaId) VALUES ('Ka',
(SELECT Id FROM Marcas Where Nome= 'Ford'))");
migrationBuilder.Sql("INSERT INTO Modelos (Nome, MarcaId) VALUES ('Eco
Esport', (SELECT Id FROM Marcas Where Nome= 'Ford'))");
//Modelos
migrationBuilder.Sql("INSERT INTO Modelos (Nome, MarcaId) VALUES
('Prisma', (SELECT Id FROM Marcas Where Nome= 'GM'))");
migrationBuilder.Sql("INSERT INTO Modelos (Nome, MarcaId) VALUES
('Onix', (SELECT Id FROM Marcas Where Nome= 'GM'))");
migrationBuilder.Sql("INSERT INTO Modelos (Nome, MarcaId) VALUES
('Cruze', (SELECT Id FROM Marcas Where Nome= 'GM'))");
//modelos
migrationBuilder.Sql("INSERT INTO Modelos (Nome, MarcaId) VALUES
('Civic', (SELECT Id FROM Marcas Where Nome= 'Honda'))");
migrationBuilder.Sql("INSERT INTO Modelos (Nome, MarcaId) VALUES ('Fit',
(SELECT Id FROM Marcas Where Nome= 'Honda'))");
migrationBuilder.Sql("INSERT INTO Modelos (Nome, MarcaId) VALUES ('HRV
Suv', (SELECT Id FROM Marcas Where Nome= 'Honda'))");
//acessórios
migrationBuilder.Sql("INSERT INTO Acessorios (Nome) VALUES ('Ar
Condicionado')");
migrationBuilder.Sql("INSERT INTO Acessorios (Nome) VALUES ('Bancos de
Couro')");
migrationBuilder.Sql("INSERT INTO Acessorios (Nome) VALUES ('Câmera de
Ré')");
}
Neste artigo vou mostrar como criar uma aplicação ASP .NET
Core integrando o Angular 2 para criar uma aplicação Básica
que consome uma Web API e exibe um formulário com
controles dropdwon, radiobutton, checkbox e textbox.
Neste artigo vamos criar a nossa Web API ASP .NET Core e
utiilizar o AutoMapper para mapear as classes do domínio e
resolver o problema da referência circular entre as
entidades Modelo e Marca. (Veja o artigo anterior neste link )
public
int
MarcaId
{ get;
set; }
}
Marca Modelo
using Alfa.Controllers.Resources;
using Alfa.Models;
using AutoMapper;
namespace Alfa.Mapping
{
public class MappingProfile : Profile
{
public MappingProfile()
{
CreateMap<Marca, MarcaResource>();
CreateMap<Modelo, ModeloResource>();
CreateMap<Acessorio, AcessorioResource>();
}
}
}
1 - MarcasControllers
using Alfa.Controllers.Resources;
using Alfa.Models;
using Alfa.Persistencia;
using AutoMapper;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace Alfa.Controllers
{
public class MarcasController : Controller
{
private readonly AlfaDbContext context;
private readonly IMapper mapper;
public MarcasController(AlfaDbContext context, IMapper mapper)
{
this.context = context;
this.mapper = mapper;
}
[HttpGet("/api/marcas")]
public async Task<IEnumerable<MarcaResource>> GetMarcas()
{
var marcas = await context.Marcas.Include(m =>
m.Modelos).ToListAsync();
return mapper.Map<List<Marca>,
List<MarcaResource>>(marcas);
}
}
}
2 - AcessoriosControllers
using Alfa.Controllers.Resources;
using Alfa.Models;
using Alfa.Persistencia;
using AutoMapper;
using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
namespace Alfa.Controllers
{
public class AcessoriosController : Controller
{
private readonly AlfaDbContext context;
private readonly IMapper mapper;
public AcessoriosController(AlfaDbContext context, IMapper
mapper)
{
this.context = context;
this.mapper = mapper;
}
[HttpGet("/api/acessorios")]
public async Task<IEnumerable<AcessorioResource>>
GetAcessorios()
{
var acessorios = await context.Acessorios.ToListAsync();
return mapper.Map<List<Acessorio>,
List<AcessorioResource>>(acessorios);
}
}
}
Dessa forma temos as seguintes rotas definidas em nossa Web
API:
veiculo-form.component.html
veiculo-form.component.ts
veiculo-form.component.css
veiculo-form.component.spec.ts
ASP .NET Core - Criando uma app Básica com EF Core, Web API
e Angular 2 – IV
http://www.macoratti.net/17/06/aspncore_ang24.htm
Neste artigo vou mostrar como criar uma aplicação ASP .NET
Core integrando o Angular 2 para criar uma aplicação Básica
que consome uma Web API e exibe um formulário com
controles dropdwon, radiobutton, checkbox e textbox.
<h2>Novo Veiculo</h2>
<form>
<div class="form-group">
<label for="marca">Marca</label>
<select id="marca" class="form-control" >
<option value=""></option>
</select>
</div>
<div class="form-group">
<label for="model">Modelo</label>
<select id="model" class="form-control">
<option value=""></option>
</select>
</div>
veiculo.service.ts
veiculo.service.spec.ts
@NgModule({
bootstrap: [ AppComponent ],
declarations: [
AppComponent,
NavMenuComponent,
CounterComponent,
FetchDataComponent,
HomeComponent,
VeiculoFormComponent
],
imports: [
UniversalModule, // Must be first import. This automatically
imports BrowserModule, HttpModule, and JsonpModule too.
FormsModule,
RouterModule.forRoot([
{ path: '', redirectTo: 'home', pathMatch: 'full' },
{ path: 'veiculos/novo', component: VeiculoFormComponent },
{ path: 'home', component: HomeComponent },
{ path: 'counter', component: CounterComponent },
{ path: 'fetch-data', component: FetchDataComponent },
{ path: '**', redirectTo: 'home' }
])
],
providers: [
VeiculoService
]
})
export class AppModule {
}
<h2>Novo Veiculo</h2>
<form>
<div class="form-group">
<label for="marca">Marca</label>
<select id="marca" class="form-control">
<option value=""></option>
<option *ngFor="let m of marcas"
value="{{m.id}}">{{m.nome}}</option>
</select>
</div>
<div class="form-group">
<label for="model">Modelo</label>
<select id="model" class="form-control">
<option value=""></option>
</select>
</div>
<button class="btn btn-primary">Salvar</button>
</form>
http://www.macoratti.net/16/03/vs_node2.html
Isso mesmo Node.js.
Usando um terminal
O Node.js oferece o REPL que é uma janela interativa para que
você possa testar e experimentar JavaScript e explorar soluções
para o problema que você está tentando resolver.
A primeira coisa que vamos fazer em qualquer aplicação web que escrevemos
com Node é solicitar um módulo que permite-nos realmente servir um site.
Uma vez que o módulo http está disponível, podemos criar um servidor
e solicitar-lhe para começar escutar solicitações.
Referências:
Seção VB .NET do Site Macoratti.net
Super DVD .NET - A sua porta de entrada na plataforma
.NET
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP
.NET e C#
Seção C# do site Macoratti.net
Super DVD C#
Super DVD Visual Basic
Curso Básico VB .NET - Vídeo Aulas
Curso C# Básico - Vídeo Aulas
ASP.NET - JavaScript - Macoratti.net
Usando jQuery com ASP .NET - Macoratti.net
Visual Studio - Bem-Vindo Node.js : desenvolvendo para
Node - Criando uma API REST com Express acessando o ...
- Macoratti
Visual Studio - Iniciando com Node.js - Criando um sevidor
... - Macoratti
Node.js - Apresentando e usando o Sequelize (acesso
ao ... - Macoratti
Visual Studio - Iniciando com Node.js - Criando um servidor
web – II
http://www.macoratti.net/16/03/vs_node3.html
Roteamento
O roteamento é um mecanismo para servir o cliente com o
conteúdo que ele solicitou. Para aplicações web baseadas em
aplicações cliente/servidor, o cliente especifica o conteúdo
desejado na URL: path e a querystring.
Defina o conteúdo do
arquivo home.html , incluindo : <h1>Página
Home</h1> apenas para identificar a página:
Repita o procedimento acima e crie os arquivos sobre.html e
404.html.
fonte: http://expressjs.com/pt-br/
http://www.macoratti.net/16/03/vs_node4.html
Essa talvez seja a aplicação mais simples que você pode criar
com o Express.
- os pacotes
npm : express , jade
, stylus
- as fontes, imagens
e referencias
javascripts : bootstr
atp, jquery,
- as fontes de
estilos : bootstrap
- o roteamento :
index.js
- as views usando o
engine Jade
O Jade é um
template engine
exclusivo para
Node.js, cuja
sintaxe é
totalmente
diferente do HTML
convencional.
- a aplicação
Node : app.js
- o pacote
json : package.json
/**
* Module dependencies.
*/
var express = require('express');
var routes = require('./routes');
var http = require('http');
var path = require('path');
var app = express();
// all environments
app.set('port', process.env.PORT || 3000);
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.json());
app.use(express.urlencoded());
app.use(express.methodOverride());
app.use(app.router);
app.use(require('stylus').middleware(path.join(__dirname,
'public')));
app.use(express.static(path.join(__dirname, 'public')));
// development only
if ('development' == app.get('env')) {
app.use(express.errorHandler());
}
app.get('/', routes.index);
app.get('/about', routes.about);
app.get('/contact', routes.contact);
http.createServer(app).listen(app.get('port'), function () {
console.log('Express server listening on port ' +
app.get('port'));
});
Neste
artigo
vou
apresent
ar os
conceitos
básicos
do
JavaScrip
t e como
usar os
seus
recursos
na
ASP
.NET.
Abra o Visual Web Developer 2005 Express e crie um novo web site na
opção File->New Web Site com o nome js_Net. Selecione a
página Default.aspx criada por padrão e selecione o modo de
visualização Source e você verá o seguinte código:
<%@ Page Language="VB" AutoEventWireup="false"
CodeFile="Default.aspx.vb" Inherits="_Default" %>
</head>
<body>
<form id="form1" runat="server">
<div>
</div>
</form>
</body>
</html>
...
<body>
<form id="form1" runat="server">
<div>
<asp:Button ID="Button1" runat="server"
Text="mensagem()" OnClientClick="mensagem()" /><br />
<asp:Button ID="Button2" runat="server"
Text="data()" OnClientClick="data()" /></div>
</form>
</body>
...
<div>
<input type="submit" name="Button1"
value="Button" onclick="Alert('Macoratti.net');" id="Button1" />
<div>
<input type="hidden" name="__EVENTVALIDATION"
id="__EVENTVALIDATION"
value="/wEWAgKljZiPAgKM54rGBlkhKnble6ps0vQaKk4pc0+p6Xkx" />
</div></form>
</body>
</html>
<script language="javascript">
<!--
function Confirmar()
{
return(window.confirm("Confirma esta operação ?"))
}
//-->
</script>
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.E
ventArgs) Handles Me.Load
Button1.Attributes.Add("onclick", "return Confirmar()")
End Sub
javascript:document.forms[0]['TextBox1'].Value=Date();
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System
.EventArgs) Handles Button1.Click
Try
'seu codigo para realizar qualque operação
'se for bem sucedida então exibe uma mensagem ao usuário
Page.ClientScript.RegisterStartupScript(Me.GetType, "OK", "windo
w.alert('operação concluída com sucesso');", True)
Catch ex As Exception
'se ocorreu um erro então exibe um aviso:
Page.ClientScript.RegisterStartupScript(Me.GetType, "Erro", "wi
ndow.alert('Ocorreu um erro na aplicação');", True)
End Try
End Sub
<div>
<script type="text/javascript">
<!--
window.alert('operação concluida com sucesso');// -->
</script>
</form>
</body>
</html>
Neste
artigo
vou
apresenta
r os
conceitos
básicos
do
JavaScrip
t e como
usar os
seus
recursos
na ASP
.NET.
width=350
heigth=250
O RegisterClientScriptBlock da propriedade ClientScript do
objeto Page executa o javascript incluindo-o na página Default.aspx.
Selecione a página Categorias.aspx e no
evento SelectedIndexChanged do controle GridView vamos incluir o
código abaixo:
Protected Sub gdvCategorias_SelectedIndexC
hanged(ByVal sender As Object, ByVal e As Sy
stem.EventArgs) Handles gdvCategorias.Select
edIndexChanged
Dim jscript As String = ""
Dim codigo As String =
gdvCategorias.SelectedRow.Cells(1).Text
Dim nome As String =
gdvCategorias.SelectedRow.Cells(2).Text
Page.ClientScript.RegisterClientScriptBlock(Me
.GetType(), "Categorias", jscript)
End Sub
Na janela
Templates
selecione
Style
Sheet e
aceite o
nome
padrão: St
yleSheet.
css
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.Ev
entArgs) Handles Me.Load
If Not Page.IsPostBack Then
txtCodigoProduto.Focus()
txtCodigoProduto.Attributes.Add("onFocus", "this.className='CaixaTex
toDestaque';")
txtCodigoProduto.Attributes.Add("onBlur", "this.className='CaixaText
oNormal';")
txtCodigoCategoria.Attributes.Add("onFocus", "this.className='CaixaT
extoDestaque';")
txtCodigoCategoria.Attributes.Add("onBlur", "this.className='CaixaTex
toNormal';")
txtNomeCategoria.Attributes.Add("onFocus", "this.className='CaixaTe
xtoDestaque';")
txtNomeCategoria.Attributes.Add("onBlur", "this.className='CaixaText
oNormal';")
txtNomeProduto.Attributes.Add("onFocus", "this.className='CaixaText
oDestaque';")
txtNomeProduto.Attributes.Add("onBlur", "this.className='CaixaTexto
Normal';")
txtPrecoProduto.Attributes.Add("onFocus", "this.className='CaixaText
oDestaque';")
txtPrecoProduto.Attributes.Add("onBlur", "this.className='CaixaTexto
Normal';")
End If
End Sub
http://www.macoratti.net/16/03/vs_node1.html
Isso mesmo Node.js.
Apresentando o Sequelize
Passo 1
Passo 2
- A seguir informe o nome do schema, eu usei o
nome mac_demo, e clique no botão Apply;
Passo 3
Crie uma pasta na sua máquina local onde será criada a nossa
aplicação Node e onde vamos instalar o Sequelize e os pacotes
necessários.
onde :
Muito bem...
Entendendo o código:
Usamos o método define para definir mapeamentos entre um
modelo e uma tabela.
connection.sync().then(function () {
Artigos.create({
titulo: 'Usando Sequelize',
assunto: 'Neste artigo vamos abordar como usar os recursos do Sequelize'
})
});
connection.sync().then(function () {
Artigos.findAll().then(function(artigos) {
console.log(artigos.dataValues)
});
});
Nada mal...