Aprimorar os métodos Details e Delete (VB)
por Rick Anderson
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
- Atualização das ferramentas do ASP.NET 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 VB.NET código-fonte está disponível para acompanhar este tópico. Baixe a versão do VB.NET. Se preferir C#, alterne para a versão C# 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 métodos Details e Delete
Quando você estrutura o Movie
controlador, ASP.NET código gerado pelo MVC que funcionou muito bem, mas isso pode se tornar 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 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 Details
método de 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 Function Details(Optional ByVal id As Integer = 0) As ActionResult
Dim movie As Movie = db.Movies.Find(id)
If movie Is Nothing Then
Return HttpNotFound()
End If
Return View(movie)
End Function
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 marcar para um filme nulo, isso pode 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 para 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 Function Delete(Optional ByVal id As Integer = 0) As ActionResult
Dim movie As Movie = db.Movies.Find(id)
If movie Is Nothing Then
Return HttpNotFound()
End If
Return View(movie)
End Function
'
' POST: /Movies/Delete/5
<HttpPost(), ActionName("Delete")>
Public Function DeleteConfirmed(Optional ByVal id As Integer = 0) As ActionResult
Dim movie As Movie = db.Movies.Find(id)
If movie Is Nothing Then
Return HttpNotFound()
End If
db.Movies.Remove(movie)
db.SaveChanges()
Return RedirectToAction("Index")
End Function
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 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:
Public Function Delete(Optional ByVal id As Integer = 0) As ActionResult
<HttpPost(), ActionName("Delete")>
Public Function DeleteConfirmed(Optional ByVal id As Integer = 0) As ActionResult
O CLR (Common Language Runtime) requer métodos sobrecarregados para ter 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 Function Delete(ByVal fcNotUsed As FormCollection, Optional ByVal id As Integer = 0) As ActionResult
Dim movie As Movie = db.Movies.Find(id)
If movie Is Nothing Then
Return HttpNotFound()
End If
db.Movies.Remove(movie)
db.SaveChanges()
Return RedirectToAction("Index")
End Function
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 Web Platform Installer para habilitar a configuração do IIS para aplicativos ASP.NET. Confira os seguintes links de implantação:
- Mapa de conteúdo de implantação do ASP.NET
- Habilitando o IIS 7.x
- Implantação de projetos de aplicativo Web
Agora, encorajo você a passar para o nosso modelo de dados de nível intermediário Criando um modelo de dados do Entity Framework para um aplicativo MVC ASP.NET e tutoriais da Loja de Música MVC, 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
Comentários
https://aka.ms/ContentUserFeedback.
Em breve: Ao longo de 2024, eliminaremos os problemas do GitHub como o mecanismo de comentários para conteúdo e o substituiremos por um novo sistema de comentários. Para obter mais informações, consulteEnviar e exibir comentários de