ASP .NET MVC 2.0 - Criando uma aplicação MVC básica (C#) - 3


Na segunda parte deste artigo definimos as Actions Details e Create e suas respectivas Views . Para encerrar vamos definir as Actions Edit e Delete.

Lembre-se que no arquivo ContatoController.cs , exibido abaixo, temos as Actions : Index, Details, Create, Edit e Delete;

Os métodos  Index, Details, Create, Edit e Delete já foram criados mas faltam ser implementados.

É o que vamos fazer, definir cada um destes métodos e em seguida criar o View para cada um deles.

Observe que os métodos Create, Edit e Delete possuem duas formas sobrecarregadas um para o GET e outro para o POST.

 

Vemos a seguir um resumo das Actions existentes na aplicação que deveremos definir:

- Index() – Action padrão do controller usada para exibir e listar itens; (já definida)
· Details(id) –
 Esta action exibe detalhes particular de um item;(já definida)
· Create() -
Action que exibe um formulário para criar um novo item;(já definida)
· Create(collection) – 
Action que inclui o novo item no banco de dados;(já definida)

· Edit(id) –
Esta action exibe um formulário para editar um item existente;
· Edit(id, collection) - Acion que atualizar um item existente no banco de dados;
- Delete() -
Action que exibe um formulário com o item a ser deletado;
- Delete(id, collection) -
 Action que exclui um item existente do banco de dados;

Agora ao trabalho...

Definindo a Action Edit

Vamos continuar definindo a Action Edit do nosso Controller ContatoController.

Lembrando que a Action Edit é realizada em duas etapas : GET e POST.

Na primeira etapa, o GET, vamos localizar o contato a ser editado e exibir os dados na página;

Na segunda etapa, o POST, vamos submeter as alterações feitas nos dados e usando os recursos do Entity Framework realizar persistência no banco de dados.

Na janela Solution Explorer selecione o arquivo ContatoController na pasta Controller e inclua o código conforme indicado na primeira Action Result Edit;

O código obtém retorna uma entidade contato obtida pela consulta LINQ que recebe o id como parâmetro.

Nesta consulta LINQ estamos usando o  operador First que retorna o primeiro elemento da seqüência que satisfaz o critério definido na expressão lambda;

Vamos criar a View para exibir os detalhes do contato para edição clicando com o botão direito do mouse sobre o método Edit e selecionando a opção Add View do menu suspenso. Será aberta a janela onde vamos definir os seguintes itens:

Após isso clique no botão Add;

Será cria o arquivo Edit.aspx na pasta Contato que será mapeada como : Contato/Edit/id onde o id representa o código do contato.

Veja abaixo a exibição da página com os dados de um contato selecionado:

 

Lembre que as classes da camada View são responsáveis por encapsular a lógica da apresentação e não contém código com regras de negócio nem com acesso a dados.

 

Todos os métodos Action precisam retornar uma instância de uma classe derivada da classe ActionResult. A classe ActionResult é a base para processar o resultado gerado pelos métodos Action, e, existem diferentes tipos de resultados possíveis, dependendo da ação que um método Action irá gerar.

A ação mais comum é a chamada ao método View; este método retorna uma instância da classe ViewResult a qual é derivada de ActionResult.

Obs: Um método Action precisa retornar um dos seguintes action helpers como um valor de retorno:  View, Redirect, RedirectToAction, RedirectToRoute, Content, ou Json.

Logo temos os seguintes tipos de resultados possíveis existentes:

  • ViewResult - Retornado por um método View;
  • RedirectToRoutResult - Retornado pelos métodos RedirectToAction e RedirectToRoute ;
  • RedirectResult. Retornado pelo método Redirect;
  • ContentResult. Retornado pelo método Content;
  • JsonResult. Retornado pelo método Json;
  • EmptyResult. Retornado se um método Action necessitar retornar um resultado null;

Vamos criar agora a segunda parte da Action Edit , o POST. Na janela Solution Explorer selecione o arquivo ContatoController na pasta Controller e inclua o código conforme indicado na primeira Action Result Edit;

No código notamos que estamos passando como parâmetro um objeto do tipo Contato (oContato).

A seguir obtemos o objeto original do banco de dados pois o que temos exibido na página ainda não foi persistido no banco de dados;

Verificamos se não há nenhum erro  e para podermos persistir esta informação na entidade usamos o método ApplyCurrentValues();

O método ApplyCurrentValues(key.EntitySetName,TEntity) aplica as alterações feita na entidade no objeto original obtido do banco de dados.

Este método é usado para aplicar as mudanças que foram feitas a objetos fora do ObjectContext, tais como um objeto desanexado (detached) que são recebidos por um web service. (Você pode usar o EntityKey do objeto detached para retornar uma instância deste objeto a partir da fonte de dados.)

Após isso usamos o  método SaveChanges() do contexto para persistir as alterações nas entidades e replicar no banco de dados.

Se você tiver um objeto com os valores atuais e desejar aplicar os valores originais chame o método ApplyOriginalValues.
Você pode também usar o método ApplyCurrentValues do ObjectStateEntry para alterar o estado de uma entidade.

Termos uma única View que já foi criada anteriormente e que se comportará diferente conforme o método for GET ou POST.

Vamos então alterar os valores exibidos na página para o contato de id igual a 2 na primeira parte do Edit , o GET, conforme a figura abaixo:

Clicando no botão Save a página será submetida realizando a segunda parte do Edit , o POST. Neste momento se não houver nenhum erro as informações serão persistidas no banco de dados e exibidas na página Index da pasta Contato que foi criada na primeira parte deste artigo.

Definindo a Action Delete

Prosseguindo vamos definir a Action Delete que nos permitirá excluir um contato existente.

Para definir a Action Delete temos que escrever dois métodos distintos para tratar esta ação:

1-) O primeiro irá exibir na view os dados  do contato selecionado pelo código (id); representa o GET;

2-) O segundo irá tratar a postagem da página submetendo a entidade para exclusão usando os recursos do Entity Framework;  representa o POST;

Na primeira parte da implementação, o GET,  estamos passando o id do contato e usando uma consulta LINQ para obter a primeira entidade contato com o id informado;

O segundo método (POST) a Action recebe uma entidade do tipo Contato e obtém o contato a ser excluído da base de dados usando uma consulta LINQ:

// obtem o contato a excluir
var contato = (from cont in ctx.Contatos where cont.id == pContato.id select cont).First();

Em seguida usa o método DeleteObject(contato) para excluir o contato e o método SaveChanges para persistir no banco de dados a exclusão.

// excluir
ctx.DeleteObject(contato);
ctx.SaveChanges();

O código completo pode ser visto na figura abaixo:

 

Para criar a View correspondente clique com o botão direito sobre a Action Delete e selecione Add View;

A seguir defina os parâmetros conforme a janela a seguir;

O arquivo Delete.aspx será criado na pasta Contato.

Executando o projeto e selecionando o contato de id =2 para ser excluído veremos a primeira parte do Action Delete, a GET, exibir as informações do contato e solicitar a confirmação:

Clicando no botão Delete a segunda parte da Action Delete, o POST, ira submeter a página e usando os recursos do Entity Framework excluí-lo e retornado a página Index.aspx da pasta Contato, onde veremos que  o contato foi excluído provando que os dados foram persistidos no banco de dados;

Com isso concluímos a criação de todas as Actions e Views para o nosso controller ContatoController e temos desta forma a realização das operações básicas de manutenção de dados em uma aplicação ASP .NET MVC.

Pegue o projeto completo aqui:  Contatos_MVC2.zip

Eu sei é apenas ASP .NET MVC, mas eu gosto...

Referências:

José Carlos Macoratti