ASP .NET MVC 3 -  Definindo o Model com ADO .NET


O Model ou Modelo é uma das partes do padrão MVC. MVC significa Model-View-Control e tem sido usado desde os anos 70.

O padrão MVC implica que uma aplicação será dividida em pelo menos 3 partes:

  1. Models - Que contém ou representa os dados com os quais a aplicação vai tratar;
  2. Views - Que são usadas para renderizar e apresentar partes do Model como uma interface de usuário;
  3. Controllers - Que processa as solicitações do usuário, realiza operações no Model e seleciona Views para apresentar ao usuário

O Model é a definição do domínio de dados com o qual sua aplicação trabalha. Se sua aplicação for um sistema bancário o modelo poderia representar tudo em um banco com o qual sua aplicação precisa lidar como contas, limites de crédito, operações financeiras.

O Model também é responsável por preservar o estado e a consistência dos dados; no exemplo da aplicação bancária,controlando a movimentação bancária de um cliente.

O Model contém as classes e os arquivos relacionados com a camada de dados da aplicação. É no model que implementamos a lógica de acesso aos dados de nossa aplicação MVC. É também no Model que definimos as regras de negócios da aplicação.

Assim o Model não trata com apresentação de dados ou processamento de requisições essas responsabilidades pertencem ao View e ao Controller.

O mundo MVC é assim: bem dividido quanto às suas responsabilidades.

A implementação ASP .NET do padrão MVC

No ASP .NET MVC, Controllers são classes geralmente derivadas de System.Web.Mvc.Controller. Cada método público em uma classe derivada de Controller é chamado um método de Action que está associado com uma URL configurável através do sistema de roteamento ASP.NET.

Quando um pedido é enviado para a URL associada com um método Action, as declarações na classe Controller são executadas afim de realizar algumas operações no modelo de domínio e, em seguida, selecionar uma View para ser exibida ao cliente.

A figura a seguir mostra a interação existente entre o Model-View-Controller em uma aplicação ASP .NET MVC:

Então se você pretende criar uma aplicação usando ASP .NET MVC já sabe onde deve definir a sua lógica de acesso aos dados: No Model.

Para ilustrar isso vamos criar um exemplo prático de uma aplicação ASP .NET MVC onde no Model vamos definir o acesso aos dados usando ADO .NET.

Definindo o Model com ADO .NET

No exemplo prático vou utilizar o Visual Web Developer 2010 Express Edition mas você pode usar também o Visual Studio 2010.

Como estamos tratando do Model vamos trabalhar com o banco de dados SQL Server Northwind.mdf e nosso objetivo será exibir os dados, apenas alguns campos, da tabela Products.

Abra o Visual Web Developer e no menu File clique em New Project;

Selecione a seguir a linguagem , perceba que podemos trabalhar com C# ou VB .NET, e o template ASP .NET MVC 3 Web Application informando o nome Produtos_MVC e clicando no botão OK;

Na janela seguinte vamos selecionar a opção - Internet Application - e o View Engine Razor (O Engine Razor é uma opção ao engine ASPX.):

Será cria a estrutura da aplicação conforme a figura abaixo:

O ASP .NET MVC facilitou a nossa vida criando a estrutura padrão contendo as pastas onde podemos definir o
Model , o View e o Controller;

Você não precisa seguir esta estrutura mas como estamos iniciando é recomendável aproveitarmos o modelo
criado;

Se executarmos o projeto iremos obter a seguinte tela:

Isso ocorre porque temos o controlador HomeController com o seguinte código:

Public Class HomeController
    Inherits System.Web.Mvc.Controller

    Function Index() As ActionResult
        ViewData("Message") = "Welcome to ASP.NET MVC!"

        Return View()
    End Function

    Function About() As ActionResult
        Return View()
    End Function
End Class

Que chama a View Index.vbhtml abaixo:

Obs: A extensão .vbhtml do arquivo index refere-se a sintaxe Razor para VB .NET se tivéssemos usado a linguagem C# a terminação seria .cshtml;

@Code
    ViewData("Title") = "Home Page"
End Code

<h2>@ViewData("Message")</h2>
<p>
    To learn more about ASP.NET MVC visit <a href="http://asp.net/mvc" title="ASP.NET MVC Website">http://asp.net/mvc</a>.
</p>

Lembre-se que no ASP .NET MVC quando você digita uma URL você invoca métodos e ao iniciarmos a aplicação o controlador executa uma ação que é o método Index() que chama a View Index.vbhtml para exibir a página ao usuário.

Bem, vou aproveitar a estrutura criada e alterar esse comportamento modificando o método Index() do controlador e a View Index.vbhtml e, o mais importante definindo um Model de forma que eu possa acessar os dados da tabela Products do banco de dados Northwtind.mdf.

Definindo o Model

Clique com o botão direito sobre a pasta Models e selecione Add -> Class e informe o nome Produtos.vb para a classe que irá representar os produtos que iremos tratar.

A seguir digite o código abaixo nesta classe:

Public Class Produtos

    Public Property ProductId()
    Public Property ProductName()
    Public Property UnitPrice()

End Class

Vamos agora criar outra classe chamada ProdutosModel.vb onde iremos definir a lógica de acesso ao banco de dados Northwind.mdf e à tabela Products.

Clique com o botão direito sobre a pasta Models e selecione Add -> Class e informe o nome ProdutosModel.vb e digite o código a seguir:

Imports System.Data.SqlClient
Imports System.Web.Configuration

 Public Function getProdutos() As IList(Of Produtos)

        Dim constr As String = WebConfigurationManager.ConnectionStrings("conexaoNorthwind").ConnectionString
        Dim sqlstr As String = "Select ProductID, ProductName, UnitPrice from Products"
        Dim sqldr As SqlDataReader = Nothing
        Dim sqlcmd As SqlCommand = Nothing
        Dim listaProdutos As List(Of Produtos) = Nothing

        listaProdutos = New List(Of Produtos)

        Using sqlcon As New SqlConnection(constr)
            sqlcmd = New SqlCommand(sqlstr, sqlcon)
            sqlcon.Open()
            sqldr = sqlcmd.ExecuteReader(CommandBehavior.CloseConnection)
            While (sqldr.Read)
                Dim produto As Produtos = New Produtos()
                produto.ProductId = sqldr.GetInt32(0)
                produto.ProductName = sqldr.GetString(1).ToString
                produto.UnitPrice = sqldr.GetDecimal(2)
                listaProdutos.Add(produto)
            End While
        End Using

        Return listaProdutos

    End Function

End Class

A classe retorna uma lista de produtos.

Note que estamos usando o namespace System.Data.SqlClient para acessar as classes e provedores de conexão com o SQL Server e o namespace System.Web.Configuration pois estamos usando a classe WebConfigurationManager para acessar a string de conexão armazenada no arquivo Web.Config;

Vamos então abrir o arquivo Web.Config e incluir a string de conexão usada para conexão como SQL Server conforme abaixo:

.....
<connectionStrings>
    <add name="conexaoNorthwind" connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=Northwind;Integrated Security=True" />
  </connectionStrings>
......

A conexão será identificada pelo nome conexaoNorthwind;

Vamos agora definir o controller a chamada ao método getProdutos() da classe ProdutosModel. Vou aproveitar o controller HomeController, mas poderia ter criado um novo controller chamado ProdutosController.

Vamos alterar então o controller HomeController conforme o código a seguir:

Imports System.Web.Mvc
Imports Produtos_MVC.ProdutosModel
Imports Produtos_MVC.Produtos
Public Class HomeController
    Inherits System.Web.Mvc.Controller

    Function Index() As ActionResult

        Dim produtosDB As ProdutosModel = New ProdutosModel
        Dim Model = produtosDB.getProdutos
        Return View(Model)

    End Function

    Function About() As ActionResult
        Return View()
    End Function
End Class

O ultimo passo é criar a View para exibir os dados. Para isso clique com o botão direito do mouse sobre o código da ActionResult Index e na janela Add View defina os valores conforme a figura abaixo:

O arquivo Index.vbhtml será gerado e você deverá ajustá-lo para ter o código conforme mostrado a seguir:

@ModelType IEnumerable(Of Produtos_MVC.Produtos)

@Code
    ViewData("Title") = "Index"
    Layout = "~/Views/Shared/_Layout.vbhtml"
End Code
<h2>Index</h2>
<table>
    <tr>
        <th></th>
    </tr>

@For Each item In Model
    Dim currentItem = item
    @<tr>
        <td>
            @currentItem.ProductId | @currentItem.ProductName | @currentItem.UnitPrice
        </td>
    </tr>
Next

</table>

Executando o projeto MVC iremos obter as informações da tabela Products:

Este é um exemplo bem básico que mostra como definir o Model e obter informações sobre ele. Na sequência mostrarei como definir o Model usando o Entity Framework.

Pegue o projeto completo aqui: Produtos_MVC.zip

João 6:53 Disse-lhes Jesus: Em verdade, em verdade vos digo: Se não comerdes a carne do Filho do homem, e não beberdes o seu sangue, não tereis vida em vós mesmos.
João 6:54
Quem come a minha carne e bebe o meu sangue tem a vida eterna; e eu o ressuscitarei no último dia.
João 6:55
Porque a minha carne verdadeiramente é comida, e o meu sangue verdadeiramente é bebida.
João 6:56
Quem come a minha carne e bebe o meu sangue permanece em mim e eu nele.

Referências:


José Carlos Macoratti