Aprimorar os métodos Details e Delete (C#)

por Rick Anderson

Observação

Uma versão atualizada deste tutorial está disponível aqui que usa ASP.NET MVC 5 e Visual Studio 2013. É mais seguro, muito mais simples de seguir e demonstra mais recursos.

Este tutorial ensinará os conceitos básicos da criação de um aplicativo Web ASP.NET MVC usando o Microsoft Visual Web Developer 2010 Express Service Pack 1, que é uma versão gratuita do Microsoft Visual Studio. Antes de começar, verifique se você instalou os pré-requisitos listados abaixo. Você pode instalar todos eles clicando no seguinte link: Web Platform Installer. Como alternativa, você pode instalar individualmente os pré-requisitos usando os seguintes links:

Se você estiver usando o Visual Studio 2010 em vez do Visual Web Developer 2010, instale os pré-requisitos clicando no seguinte link: Pré-requisitos do Visual Studio 2010.

Um projeto do Visual Web Developer com código-fonte C# está disponível para acompanhar este tópico. Baixe a versão do C#. Se preferir o Visual Basic, alterne para a versão do Visual Basic deste tutorial.

Nesta parte do tutorial, você fará algumas melhorias nos métodos e Delete gerados Details automaticamente. Essas alterações não são necessárias, mas com apenas alguns pequenos bits de código, você pode aprimorar facilmente o aplicativo.

Aprimorando os detalhes e excluir métodos

Quando você scaffolded o Movie controlador, ASP.NET código gerado MVC que funcionou muito bem, mas que pode ser feito mais robusto com apenas algumas pequenas alterações.

Abra o Movie controlador e modifique o Details método retornando HttpNotFound quando um filme não for encontrado. Você também deve modificar o Details método para definir um valor padrão para a ID que é passada para ele. (Você fez alterações semelhantes ao Edit método na parte 6 deste tutorial.) No entanto, você deve alterar o tipo de retorno do método de DetailsViewResult para ActionResult, porque o HttpNotFound método não retorna um ViewResult objeto . O exemplo a seguir mostra o método modificado Details .

public ActionResult Details(int id = 0)
{
    Movie movie = db.Movies.Find(id);
    if (movie == null)
    {
        return HttpNotFound();
    }
    return View(movie);
}

O Code First facilita a pesquisa de dados usando o Find método . Um recurso de segurança importante que criamos no método é que o código verifica se o Find método encontrou um filme antes que o código tente fazer qualquer coisa com ele. Por exemplo, um hacker pode introduzir erros no site alterando a URL criada pelos links de http://localhost:xxxx/Movies/Details/1 para algo como http://localhost:xxxx/Movies/Details/12345 (ou algum outro valor que não representa um filme real). Se você não fizer o marcar para um filme nulo, isso poderá resultar em um erro de banco de dados.

Da mesma forma, altere os Delete métodos e DeleteConfirmed para especificar um valor padrão para o parâmetro ID e retornar HttpNotFound quando um filme não for encontrado. Os métodos atualizados Delete no Movie controlador são mostrados abaixo.

// GET: /Movies/Delete/5

public ActionResult Delete(int id = 0)
{
    Movie movie = db.Movies.Find(id);
    if (movie == null)
    {
        return HttpNotFound();
    }
    return View(movie);
}

//
// POST: /Movies/Delete/5

[HttpPost, ActionName("Delete")]
public ActionResult DeleteConfirmed(int id = 0)
{
    Movie movie = db.Movies.Find(id);
    if (movie == null)
    {
        return HttpNotFound();
    }
    db.Movies.Remove(movie);
    db.SaveChanges();
    return RedirectToAction("Index");
}

Observe que o Delete método não exclui os dados. A execução de uma operação de exclusão em resposta a uma solicitação GET (ou, de fato, a execução de uma operação de edição, criação ou qualquer outra operação que altera dados) abre uma falha de segurança. Para obter mais informações sobre isso, consulte a entrada de blog de Stephen Walther ASP.NET Dica de MVC nº 46 — Não use Excluir Links porque eles criam falhas de segurança.

O método HttpPost que exclui os dados é chamado DeleteConfirmed para fornecer ao método HTTP POST um nome ou uma assinatura exclusiva. As duas assinaturas de método são mostradas abaixo:

// GET: /Movies/Delete/5
public ActionResult Delete(int id = 0)

//
// POST: /Movies/Delete/5
[HttpPost, ActionName("Delete")]
public ActionResult DeleteConfirmed(int id = 0)

O CLR (Common Language Runtime) exige que os métodos sobrecarregados tenham uma assinatura exclusiva (mesmo nome, lista diferente de parâmetros). No entanto, aqui você precisa de dois métodos Delete – um para GET e outro para POST – que exigem a mesma assinatura. (Ambos precisam aceitar um único inteiro como parâmetro.)

Para resolver isso, você pode fazer algumas coisas. Uma delas é dar aos métodos nomes diferentes. Foi o que fizemos no exemplo anterior. No entanto, isso apresenta um pequeno problema: o ASP.NET mapeia os segmentos de URL para os métodos de ação por nome e se você renomear um método, o roteamento normalmente não conseguirá encontrar esse método. A solução é o que você vê no exemplo, que é adicionar o atributo ActionName("Delete") ao método DeleteConfirmed. Isso efetivamente executa o mapeamento para o sistema de roteamento para que uma URL que inclua /Delete/para uma solicitação POST encontre o DeleteConfirmed método .

Outra maneira de evitar um problema com métodos que têm nomes e assinaturas idênticos é alterar artificialmente a assinatura do método POST para incluir um parâmetro não utilizado. Por exemplo, alguns desenvolvedores adicionam um tipo FormCollection de parâmetro que é passado para o método POST e, em seguida, simplesmente não usam o parâmetro :

public ActionResult Delete(FormCollection fcNotUsed, int id = 0)
{
    Movie movie = db.Movies.Find(id);
    if (movie == null)
    {
        return HttpNotFound();
    }
    db.Movies.Remove(movie);
    db.SaveChanges();
    return RedirectToAction("Index");
}

Conclusão

Agora você tem um aplicativo MVC ASP.NET completo que armazena dados em um banco de dados SQL Server Compact. Você pode criar, ler, atualizar, excluir e pesquisar filmes.

Captura de tela que mostra a página Índice de Pesquisa no Aplicativo de Filme M V C. A página mostra uma lista de quatro filmes.

Este tutorial básico fez com que você começasse a criar controladores, associá-los a exibições e transmitir dados embutidos em código. Em seguida, você criou e projetou um modelo de dados. Entity Framework Code Primeiro criou um banco de dados do modelo de dados em tempo real e o sistema de scaffolding do ASP.NET MVC gerou automaticamente os métodos de ação e exibições para operações CRUD básicas. Em seguida, você adicionou um formulário de pesquisa que permite que os usuários pesquisem o banco de dados. Você alterou o banco de dados para incluir uma nova coluna de dados e atualizou duas páginas para criar e exibir esses novos dados. Você adicionou validação marcando o modelo de dados com atributos do DataAnnotations namespace. A validação resultante é executada no cliente e no servidor.

Se você quiser implantar seu aplicativo, será útil primeiro testar o aplicativo em seu servidor IIS 7 local. Você pode usar esse link do Instalador da Plataforma Web para habilitar a configuração do IIS para aplicativos ASP.NET. Confira os seguintes links de implantação:

Agora eu encorajo você a passar para o nosso nível intermediário Criando um modelo de dados do Entity Framework para um aplicativo MVC ASP.NET e tutoriais do MVC Music Store, para explorar os artigos de ASP.NET no MSDN e para marcar os muitos vídeos e recursos em https://asp.net/mvc para saber ainda mais sobre ASP.NET MVC! Os fóruns do ASP.NET MVC são um ótimo lugar para fazer perguntas.

Aproveite!

— Scott Hanselman (http://hanselman.com e @shanselman no Twitter) e Rick Anderson blogs.msdn.com/rickAndy