ASP .NET Core - Criando uma aplicação ASP .NET Core MVC com o VS 2017 - X

 Neste artigo eu vou mostrar como criar uma aplicação ASP .NET Core MVC usando o VS 2017.

Continuando a nona parte do artigo  vamos analisar o aplicativo e fazer algumas melhorias nos métodos Details e Delete gerados automaticamente.

Este artigo conclui esta introdução básica ao ASP .NET Core.

Examinando o método Details

Vamos abrir o arquivo FilmesController.cs na pasta Controllers e examinar o método Details:

        // 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);
        }

O mecanismo de Scaffolding MVC que criou este método Action adicionou um comentário mostrando uma solicitação HTTP que invoca o método. Neste caso, é uma solicitação GET com três segmentos de URL, o controlador Filmes, o método Details e um valor id. Lembre que esses segmentos são definidos em no método Configure do arquivo Startup.cs:

     ...
     app.UseMvc(routes =>
     {
          routes.MapRoute( 
          name: "default",
          template: "{controller=Home}/{action=Index}/{id?}");
    });
   ...

O EF facilita a pesquisa dos dados usando o método SingleOrDefaultAsync. Um recurso de segurança importante deste método Details é que o código verifica se o método de pesquisa encontrou um filme antes de tentar fazer qualquer coisa com ele.

Por exemplo, um hacker pode introduzir erros no site alterando a URL criada pelos links de http://localhost:xxxx/Filmes/Details/1 para algo como http://localhost:xxxx/Filmes/Details/12345 ( Ou algum outro valor que não represente um filme real) com um objetivo de provocar um erro.

Se você não fosse feita a verificação de filme nulo, o aplicativo lançaria uma exceção.

Examinando o método Delete

Vejamos agora os métodos Delete e DeleteConfirm do controlador FilmesController:

        // 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.

O método [HttpPost] que exclui os dados tem o nome DeleteConfirmed para dar ao método HTTP POST uma assinatura ou nome exclusivo. As assinaturas de dois métodos são mostradas abaixo:

´      // GET: Filmes/Delete/5
        public async Task<IActionResult> Delete(int? id)
        // POST: Filmes/Delete/5
        [HttpPost, ActionName("Delete")]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> DeleteConfirmed(int id)

A Common Language Runtime (CLR) requer métodos sobrecarregados para ter uma assinatura de parâmetro exclusivo (mesmo nome de método mas lista diferente de parâmetros). No entanto, aqui você precisa de dois métodos Delete - um para GET e outro para POST - e ambos têm a mesma assinatura de parâmetro. (Ambos precisam aceitar um único inteiro como um parâmetro.)

Existem duas abordagens para este problema, uma delas é dar aos métodos nomes diferentes. Isso é o que o mecanismo Scaffolding fez no exemplo anterior. No entanto, isso introduz um pequeno problema: a ASP.NET mapeia segmentos de um URL para métodos Action por nome,  e, se você renomear um método, o roteamento normalmente não seria capaz de encontrar esse método.

A solução é o que você vê no exemplo, que é adicionar o atributo ActionName ("Delete") para o método DeleteConfirmed.

Esse atributo realiza o mapeamento para o sistema de roteamento de modo que uma URL que inclui /Delete/ para uma solicitação POST irá encontrar o método DeleteConfirmed.

Outra solução para contornar o problema de métodos que têm nomes e assinaturas idênticas, é alterar artificialmente a assinatura do método POST para incluir um parâmetro extra (não utilizado). Isso é o que fizemos em um post anterior quando adicionamos o parâmetro notUsed. Você poderia fazer a mesma coisa aqui para o método [HttpPost] Delete:

// POST: Movies/Delete/6
[ValidateAntiForgeryToken]
public async Task<IActionResult> Delete(int id, bool notUsed)

E assim concluímos essa série de artigo apresentando os conceitos básicos da ASP .NET MVC Core.

Na verdade se você já conhecia a ASP .NET MVC  percebeu que a maioria dos conceitos sobre como a ASP .NET MVC funciona são utilizados com ASP .NET MVC Core.

Se você não conhece os fundamenteos da tecnologia ASP .NET MVC conheça o curso : CURSO ASP .NET MVC 5 Vídeo Aulas

Pegue o projeto aqui : MvcFilme.zip

E, como Moisés levantou a serpente no deserto, assim importa que o Filho do homem seja levantado;
Para que todo aquele que nele crê não pereça, mas tenha a vida eterna.

João 3:14,15

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti