Compartilhar via


Noções básicas sobre modelos, exibições e controladores (C#)

por Stephen Walther

Confuso sobre modelos, exibições e controladores? Neste tutorial, Stephen Walther apresenta as diferentes partes de um aplicativo MVC ASP.NET.

Este tutorial fornece uma visão geral de alto nível de ASP.NET modelos, exibições e controladores do MVC. Em outras palavras, ele explica m', V', e C' em ASP.NET MVC.

Depois de ler este tutorial, você deve entender como as diferentes partes de um aplicativo MVC ASP.NET funcionam juntas. Você também deve entender como a arquitetura de um aplicativo MVC ASP.NET é diferente de um aplicativo ASP.NET Web Forms ou do aplicativo Active Server Pages.

O exemplo ASP.NET aplicativo MVC

O modelo padrão do Visual Studio para criar aplicativos Web ASP.NET MVC inclui um aplicativo de exemplo extremamente simples que pode ser usado para entender as diferentes partes de um aplicativo MVC ASP.NET. Aproveitamos esse aplicativo simples neste tutorial.

Crie um novo aplicativo ASP.NET MVC com o modelo MVC iniciando o Visual Studio 2008 e selecionando a opção de menu Arquivo, Novo Projeto (consulte Figura 1). Na caixa de diálogo Novo Projeto, selecione sua linguagem de programação favorita em Tipos de Projeto (Visual Basic ou C#) e selecione ASP.NET Aplicativo Web MVC em Modelos. Clique no botão OK.

Caixa de diálogo Novo Projeto

Figura 01: Caixa de diálogo Novo Projeto (Clique para exibir imagem em tamanho real)

Quando você cria um novo aplicativo ASP.NET MVC, a caixa de diálogo Criar Projeto de Teste de Unidade é exibida (consulte a Figura 2). Essa caixa de diálogo permite que você crie um projeto separado em sua solução para testar seu aplicativo ASP.NET MVC. Selecione a opção Não, não crie um projeto de teste de unidade e clique no botão OK .

Caixa de diálogo Criar Teste de Unidade

Figura 02: Caixa de diálogo Criar Teste de Unidade (clique para exibir imagem em tamanho real)

Depois que o novo aplicativo ASP.NET MVC for criado. Você verá várias pastas e arquivos na janela Gerenciador de Soluções. Em particular, você verá três pastas chamadas Modelos, Exibições e Controladores. Como você pode adivinhar nos nomes das pastas, essas pastas contêm os arquivos para implementar modelos, exibições e controladores.

Se você expandir a pasta Controladores, deverá ver um arquivo chamado AccountController.cs e um arquivo chamado HomeController.cs. Se você expandir a pasta Exibições, deverá ver três subpastas chamadas Conta, Página Inicial e Compartilhada. Se você expandir a pasta Página Inicial, verá dois arquivos adicionais chamados About.aspx e Index.aspx (consulte Figura 3). Esses arquivos compõem o aplicativo de exemplo incluído com o modelo padrão ASP.NET MVC.

A janela Gerenciador de Soluções

Figura 03: a janela Gerenciador de Soluções (Clique para exibir a imagem em tamanho real)

Você pode executar o aplicativo de exemplo selecionando a opção de menu Depurar, Iniciar Depuração. Como alternativa, você pode pressionar a tecla F5.

Quando você executa pela primeira vez um aplicativo ASP.NET, a caixa de diálogo na Figura 4 é exibida, o que recomenda que você habilite o modo de depuração. Clique no botão OK e o aplicativo será executado.

Caixa de diálogo Depuração Não Habilitada

Figura 04: caixa de diálogo Depuração Não Habilitada (Clique para exibir imagem em tamanho real)

Quando você executa um aplicativo MVC ASP.NET, o Visual Studio inicia o aplicativo no navegador da Web. O aplicativo de exemplo consiste em apenas duas páginas: a página Índice e a página Sobre. Quando o aplicativo é iniciado pela primeira vez, a página Índice é exibida (consulte Figura 5). Você pode navegar até a página Sobre clicando no link do menu no canto superior direito do aplicativo.

A página Índice

Figura 05: a página Índice (Clique para exibir a imagem em tamanho real)

Observe as URLs na barra de endereços do navegador. Por exemplo, quando você clica no link do menu Sobre, a URL na barra de endereços do navegador é alterada para /Home/About.

Se você fechar a janela do navegador e retornar ao Visual Studio, não será possível encontrar um arquivo com o caminho Página Inicial/Sobre. Os arquivos não existem. Como isso é possível?

Uma URL não é igual a uma página

Quando você cria um aplicativo ASP.NET Web Forms tradicional ou um aplicativo Active Server Pages, há uma correspondência um-para-um entre uma URL e uma página. Se você solicitar uma página chamada SomePage.aspx do servidor, é melhor que haja uma página no disco chamada SomePage.aspx. Se o arquivo SomePage.aspx não existir, você receberá um erro 404 - Página Não Encontrada .

Ao criar um aplicativo MVC ASP.NET, por outro lado, não há correspondência entre a URL que você digita na barra de endereços do navegador e os arquivos encontrados em seu aplicativo. Em um aplicativo MVC ASP.NET, uma URL corresponde a uma ação do controlador em vez de uma página no disco.

Em um aplicativo ASP.NET ou ASP tradicional, as solicitações de navegador são mapeadas para páginas. Em um aplicativo MVC ASP.NET, por outro lado, as solicitações de navegador são mapeadas para ações do controlador. Um aplicativo ASP.NET Web Forms é centrado no conteúdo. Um aplicativo MVC ASP.NET, por outro lado, é centrado na lógica do aplicativo.

Noções básicas sobre o roteamento de ASP.NET

Uma solicitação de navegador é mapeada para uma ação do controlador por meio de um recurso da estrutura de ASP.NET chamada ASP.NET Roteamento. ASP.NET Roteamento é usado pela estrutura MVC ASP.NET para rotear solicitações de entrada para ações do controlador.

ASP.NET Roteamento usa uma tabela de rotas para lidar com solicitações de entrada. Essa tabela de rotas é criada quando seu aplicativo Web é iniciado pela primeira vez. A tabela de rotas é configurada no arquivo Global.asax. O arquivo MVC Global.asax padrão está contido na Listagem 1.

Listagem 1 – Global.asax

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace MvcApplication1
{
    // Note: For instructions on enabling IIS6 or IIS7 classic mode, 
    // visit https://go.microsoft.com/?LinkId=9394801

    public class MvcApplication : System.Web.HttpApplication
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                "Default",                                              // Route name
                "{controller}/{action}/{id}",                           // URL with parameters
                new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
            );

        }

        protected void Application_Start()
        {
            RegisterRoutes(RouteTable.Routes);
        }
    }
}

Quando um aplicativo ASP.NET é iniciado pela primeira vez, o método Application_Start() é chamado. Na Listagem 1, esse método chama o método RegisterRoutes() e o método RegisterRoutes() cria a tabela de rotas padrão.

A tabela de rotas padrão consiste em uma rota. Essa rota padrão divide todas as solicitações de entrada em três segmentos (um segmento de URL é qualquer coisa entre barras de avanço). O primeiro segmento é mapeado para um nome de controlador, o segundo segmento é mapeado para um nome de ação e o segmento final é mapeado para um parâmetro passado para a ação chamada ID.

Por exemplo, considere a seguinte URL:

/Product/Details/3

Essa URL é analisada em três parâmetros como este:

Controller = Product

Ação = Detalhes

Id = 3

A rota Padrão definida no arquivo Global.asax inclui valores padrão para todos os três parâmetros. O controlador padrão é Home, a ação padrão é Index e a ID padrão é uma cadeia de caracteres vazia. Com esses padrões em mente, considere como a seguinte URL é analisada:

/Employee

Essa URL é analisada em três parâmetros como este:

Controlador = Funcionário

Ação = Índice

Id =

Por fim, se você abrir um aplicativo MVC ASP.NET sem fornecer nenhuma URL (por exemplo, http://localhost) a URL será analisada desta forma:

Controlador = Página Inicial

Ação = Índice

Id =

A solicitação é roteada para a ação Index() na classe HomeController.

Noções básicas sobre controladores

Um controlador é responsável por controlar a maneira como um usuário interage com um aplicativo MVC. Um controlador contém a lógica de controle de fluxo para um aplicativo MVC ASP.NET. Um controlador determina qual resposta enviar de volta a um usuário quando um usuário faz uma solicitação de navegador.

Um controlador é apenas uma classe (por exemplo, uma classe Visual Basic ou C#). O exemplo ASP.NET aplicativo MVC inclui um controlador chamado HomeController.cs localizado na pasta Controladores. O conteúdo do arquivo HomeController.cs é reproduzido na Listagem 2.

Listagem 2 – HomeController.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    [HandleError]
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            ViewData["Title"] = "Home Page";
            ViewData["Message"] = "Welcome to ASP.NET MVC!";

            return View();
        }

        public ActionResult About()
        {
            ViewData["Title"] = "About Page";

            return View();
        }
    }
}

Observe que o HomeController tem dois métodos chamados Index() e About(). Esses dois métodos correspondem às duas ações expostas pelo controlador. A URL /Home/Index invoca o método HomeController.Index() e a URL /Home/About invoca o método HomeController.About().

Qualquer método público em um controlador é exposto como uma ação do controlador. Você precisa ter cuidado com isso. Isso significa que qualquer método público contido em um controlador pode ser invocado por qualquer pessoa com acesso à Internet inserindo a URL certa em um navegador.

Compreendendo as exibições

As duas ações do controlador expostas pela classe HomeController, Index() e About(), ambas retornam uma exibição. Uma exibição contém a marcação HTML e o conteúdo que é enviado para o navegador. Uma exibição é equivalente a uma página ao trabalhar com um aplicativo MVC ASP.NET.

Você deve criar seus modos de exibição no local certo. A ação HomeController.Index() retorna uma exibição localizada no seguinte caminho:

\Views\Home\Index.aspx

A ação HomeController.About() retorna uma exibição localizada no seguinte caminho:

\Views\Home\About.aspx

Em geral, se você quiser retornar uma exibição para uma ação do controlador, precisará criar uma subpasta na pasta Exibições com o mesmo nome do controlador. Dentro da subpasta, você deve criar um arquivo .aspx com o mesmo nome que a ação do controlador.

O arquivo na Listagem 3 contém a exibição About.aspx.

Listagem 3 – About.aspx

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>

<asp:Content ID="aboutContent" ContentPlaceHolderID="MainContent" runat="server">
    <h2>About</h2>
    <p>
        Put content here.
    </p>
</asp:Content>

Se você ignorar a primeira linha na Listagem 3, a maior parte do restante da exibição consistirá em HTML padrão. Você pode modificar o conteúdo da exibição inserindo qualquer HTML desejado aqui.

Um modo de exibição é muito semelhante a uma página no Active Server Pages ou ASP.NET Web Forms. Uma exibição pode conter conteúdo HTML e scripts. Você pode escrever os scripts em sua linguagem de programação .NET favorita (por exemplo, C# ou Visual Basic .NET). Você usa scripts para exibir conteúdo dinâmico, como dados de banco de dados.

Noções básicas sobre modelos

Discutimos os controladores e discutimos as exibições. O último tópico que precisamos discutir são os modelos. O que é um modelo MVC?

Um modelo MVC contém toda a lógica do aplicativo que não está contida em uma exibição ou controlador. O modelo deve conter toda a lógica de negócios do aplicativo, a lógica de validação e a lógica de acesso ao banco de dados. Por exemplo, se você estiver usando o Microsoft Entity Framework para acessar seu banco de dados, criará suas classes do Entity Framework (seu arquivo .edmx) na pasta Modelos.

Uma exibição deve conter apenas a lógica relacionada à geração da interface do usuário. Um controlador deve conter apenas o mínimo de lógica necessário para retornar a exibição correta ou redirecionar o usuário para outra ação (controle de fluxo). Todo o resto deve estar contido no modelo.

Em geral, você deve se esforçar por modelos gordos e controladores magros. Os métodos do controlador devem conter apenas algumas linhas de código. Se uma ação do controlador ficar muito gorda, considere mover a lógica para uma nova classe na pasta Modelos.

Resumo

Este tutorial forneceu uma visão geral de alto nível das diferentes partes de um aplicativo Web ASP.NET MVC. Você aprendeu como ASP.NET Roteamento mapeia solicitações de entrada do navegador para ações específicas do controlador. Você aprendeu como os controladores orquestram como as exibições são retornadas ao navegador. Por fim, você aprendeu como os modelos contêm negócios de aplicativos, validação e lógica de acesso ao banco de dados.