Compartilhar via


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 MVC ASP.NET 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 C#. Se você preferir o Visual Basic, alterne para a versão 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 pedaços de código, você pode aprimorar facilmente o aplicativo.

Melhorando os detalhes e métodos de exclusão

Quando você montou o controlador, ASP.NET MVC gerou um código que funcionou muito bem, mas que pode ser mais robusto Movie 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 no 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, pois 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 incorporamos ao 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 verificar se há um filme nulo, isso poderá resultar em um erro de banco de dados.

Da mesma forma, altere os Delete métodos and 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 controlador são mostrados Movie 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.

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) requer 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 é dar nomes diferentes aos métodos. 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 executa efetivamente 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 problemas 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 M V C Movie. A página mostra uma lista de quatro filmes.

Este tutorial básico permitiu que você começasse a criar controladores, associá-los a exibições e transmitir dados codificados. Em seguida, você criou e projetou um modelo de dados. O Entity Framework Code First criou um banco de dados a partir do modelo de dados em tempo real, e o sistema de scaffolding MVC ASP.NET gerou automaticamente os métodos de ação e as 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, em seguida, 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, é útil primeiro testar o aplicativo no servidor IIS 7 local. Você pode usar este link do Web Platform Installer para habilitar a configuração do IIS para aplicativos ASP.NET. Consulte os seguintes links de implantação:

Agora, encorajo você a passar para nossos tutoriais de nível intermediário Criando um modelo de dados do Entity Framework para um aplicativo MVC ASP.NET e MVC Music Store , para explorar os ASP.NET artigos sobre o MSDN e conferir os muitos vídeos e recursos em https://asp.net/mvc para saber ainda mais sobre ASP.NET MVC! Os fóruns 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