ASP .NET - Usando o ASP .NET MVC Framework (Preview 3) - II


Continuando o meu artigo anterior onde definimos os métodos na classe ProductsController conforme abaixo:

Vou abordar agora um conceito importante que é o mapeamento de parâmetros da URL para os métodos Action do Controller.

Existem diversas maneiras de acessar parâmetros em uma URL a partir dos métodos Actions da classe Controller. (O Framework MVC já usa as novas interfaces System.Web.IHttpRequest e System.Web.IHttpResponse)

No exemplo abaixo vemos que podemos usar a API Request para retornar manualmente um valor de um parâmetro ID a partir de nosso método Action - Detail na classe ProductsController:

' URL - /Products/Detail?id=3

Public sub Detail()

      Dim id As integer  = convert.ToInt32(Request("id"))

End Sub

Uma outra forma suportada pelo framework ASP .NET MVC é o mapeamento do valor do parâmetro da URL de entrada como sendo um argumento do método Action. Assim , por padrão , se você tiver um argumento definido no seu método Action , o framework MVC irá olhar o dado da requisição de entrada verificando se existe um valor HTTP request com o mesmo nome. Se existir o valor do request será passado de forma automática para o método da Action. Veja exemplo a seguir:

' URL - /Products/Detail?id=3

Public sub Detail( int id )

End Sub

Definindo o Modelo (Model)

No mundo MVC o Modelo ou Model tem o papel de realizar a persistência das informações e manter o estado. Para isso usamos classes que representam os dados em um banco de dados. Assim podemos ter um objeto Product que é usado para representar os dados da tabela Products no nosso modelo de banco de dados relacional.

O ASP .NET MVC permite que você use qualquer padrão de acesso a dados com o objetivo de gerenciar o seu modelo. Assim você pode usar ADO .NET (datasets e datareaders) ou ainda uma ferramenta que faz  o mapeamento objeto relacional como o NHibernate.

No nosso exemplo vamos usar o LINQ to SQL para efetuar o mapeamento objeto Relacional.

Clique com o botão direito do mouse  sobre a pasta Models e selecione a opção Add-> New Item;

A seguir em Templates selecione LINQ To SQL Classes e informe o nome Northwind.dbml;

Como eu já mencionei , nosso exemplo irá trabalhar com as tabelas Categories, Products e Suppliers do banco de dados Northwind.mdf, dessa forma abra o Server Explorer e selecionando o banco de dados arraste estas tabelas para o descritor ORM do LINQ;

Perceba que foram criadas 3 classes : Category , Product e Supplier que representam nosso modelo de dados;

Após realizar esta tarefa, o arquivo Northwind.dbml será incluído na pasta Models. Vamos aproveitar e incluir uma nova classe chamada NorthwindContext.vb na pasta Models; para isso clique com o botão direito do mouse sobre a pasta Models e  selecione Add -> New Item; em seguida selecione o template Class e informe o nome NorthwindContext.vb;

Vamos criar nesta classe alguns métodos para encapsular algumas expressões LINQ conforme abaixo:

Imports System

Imports System.Data

Imports System.Collections.Generic

Imports System.Linq
 

Namespace macoratti.Models


Partial
Public Class NorthwindModel

        'instanciamos a classe DataContext que ja 

             'tem mapeado os objetos e a conexÆo

              Dim db As New NorthwindDataContext

 

         Public Function GetCategories() As List(Of Category)

             'retorna todas as categorias

                       Return db.Categories.ToList

        End Function
 

       Public Function GetProducts(ByVal categoria As String) As List(Of Product)

          'retorna uma lista de produtos de uma categoria informada

                  Return db.Products.Where(Function(p) p.Category.CategoryName = categoria)

       End Function
 

       Public Function getProductById(ByVal id As Integer) As Product

           'retorna um produto especifico

                    Return db.Products.Single(Function(p) p.ProductID = id)

        End Function

End Class
 

End Namespace

Com os métodos criados fica muito fácil retornar os objetos do modelo de dados que iremos necessitar na nossa classe ProductsController, sem precisar escrever qualquer expressão LINQ na classe Controller.

Finalizando os métodos da classe Controller

Já podemos então finalizar os métodos da nossa classe ProductsController. Abra então esta classe e digite o código abaixo:

Imports aspnetWebMVCapp.macoratti.Models

Imports System.Web.Mvc

Imports System.Collections.Generic

 

Namespace macoratti.controllers

Public Class ProductsController

           Inherits System.Web.Mvc.Controller

 

    Dim db As New NorthwindModel

     '/Products/Categories

    Public Function Categories()

           Dim Allcategories As List(Of Category) = db.GetCategories

         Return  View("Categories", Allcategories)

      End Sub

 

     '/Products/List/Beverages

      Public Function List(ByVal category As String)

          Dim products As List(Of Product) = db.GetProductsByCategory(category)

        Return View("ListingByCategory", products)

       End Sub

 

      '/Products/Detail/5

        Public Function Detail(ByVal id As Integer)

               Dim product As Product = db.getProductById(id)

           Return View("Detail", product)

         End Sub

End Class

End Namespace

Veja como a quantidade de linhas de código usada foi pequena , tudo isso graças as regras de roteamento e processamento de parâmetros realizados pelo Framework MVC. Além disso nosso exemplo é bem simples.

Como vamos usar os métodos criados na camada Models para ter acesso a eles devemos referenciar a camada na classe ProductsController:

Imports aspnetWebMVCapp.macoratti.Models

As demais referências referem-se a coleções genéricas e aos recursos do framework MVC:

Imports System.Web.Mvc

Imports System.Collections.Generic

Em seguida vemos que estamos criando uma instância da classe NorthwindModel de forma a podermos acessar os métodos criados na camada Models :

 Dim db As New NorthwindModel

 

 

Os métodos Categories, List e Detail estão usando os métodos criados na camada Model e estão passando para a camada View o resultado obtido para que seja gerada o resultado final para o usuário na camada de apresentação.

 

Estamos usando o método View(parm1, parm2) onde estamos passando dois parâmetros :

  1. O primeiro parâmetro define o nome da view a renderizar; (Quando o nome da view for o mesmo do método Action ele não é obrigatório.)

  2. O segundo parâmetro é uma lista de objetos que são passados para a camada view, sendo que estes objetos serão usados para gerar a saida HTML;

Em uma aplicação web baseada na arquitetura MVC os Controllers são responsáveis pelo processamento das requisições de chegada, tratamento da entrada e fornecida e interações com usuário e pela execução da lógica da aplicação.

 

Os Controllers não geram uma resposta HTML para uma requisição esta é uma responsabilidade da camada View realizadas pelos componentes desta camada da aplicação que são implementados em classes na pasta Views.

 

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;

 

No fluxo básico (representado pela figura) de uma aplicação ASP .NET MVC  temos que:

 

- Os métodos Action do Controller irão tratar a requisição de entrada , usando os valores dos parâmetros para executar a lógica apropriada do código, retornando ou atualizando os objetos do modelo de dados;

- Em seguida irão selecionar um View para renderizar uma resposta de saída para a cada de apresentação no navegador;

- O Controller irá passar explicitamente todos os dados e variáveis requeridas pela View com o objetivo de gerar a resposta de saída adequada;

 

 

Agora temos que implementar a saída HTML para a camada de apresentação na camada View criando os arquivos necessários na pasta Views para responder aos objetos passados pelos métodos Action da nossa classe ProductsController através do método View().

 

Lembrando que a pasta Views  é a localização recomendada para localização dos recursos que serão usados para gerar a camada de apresentação.

Veja a continuação do artigo em : ASP .NET - Usando o ASP .NET MVC Framework - Preview 3 - III

referências:


José Carlos Macoratti