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:
- Pré-requisitos do Visual Studio Web Developer Express SP1
- ASP.NET Atualização de Ferramentas do MVC 3
- SQL Server Compact 4.0(runtime + suporte a ferramentas)
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 Details
ViewResult
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.
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:
- ASP.NET mapa de conteúdo de implantação
- Habilitando o IIS 7.x
- Implantação de projetos de aplicativo Web
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