Visão geral sobre o controlador do ASP.NET MVC (C#)

por Stephen Walther

Neste tutorial, Stephen Walther apresenta você a ASP.NET controladores MVC. Você aprenderá a criar novos controladores e retornar diferentes tipos de resultados de ação.

Este tutorial explora o tópico de ASP.NET controladores MVC, ações do controlador e resultados de ação. Depois de concluir este tutorial, você entenderá como os controladores são usados para controlar a maneira como um visitante interage com um site ASP.NET MVC.

Noções básicas sobre controladores

Os controladores MVC são responsáveis por responder às solicitações feitas em um site ASP.NET MVC. Cada solicitação do navegador é mapeada para um controlador específico. Por exemplo, imagine que você insira a seguinte URL na barra de endereços do navegador:

http://localhost/Product/Index/3

Nesse caso, um controlador chamado ProductController é invocado. O ProductController é responsável por gerar a resposta à solicitação do navegador. Por exemplo, o controlador pode retornar uma exibição específica de volta para o navegador ou o controlador pode redirecionar o usuário para outro controlador.

A listagem 1 contém um controlador simples chamado ProductController.

Listing1 - Controllers\ProductController.cs

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

namespace MvcApplication1.Controllers
{
    public class ProductController : Controller
    {
        //
        // GET: /Products/

        public ActionResult Index()
        {
            // Add action logic here
            return View();
        }
    }
}

Como você pode ver na Listagem 1, um controlador é apenas uma classe (uma classe .NET ou C# do Visual Basic). Um controlador é uma classe derivada da classe base System.Web.Mvc.Controller. Como um controlador herda dessa classe base, um controlador herda vários métodos úteis gratuitamente (discutimos esses métodos em um momento).

Noções básicas sobre ações do controlador

Um controlador expõe as ações do controlador. Uma ação é um método em um controlador que é chamado quando você insere uma URL específica na barra de endereços do navegador. Por exemplo, imagine que você faça uma solicitação para a seguinte URL:

http://localhost/Product/Index/3

Nesse caso, o método Index() é chamado na classe ProductController. O método Index() é um exemplo de ação do controlador.

Uma ação do controlador deve ser um método público de uma classe de controlador. Os métodos C#, por padrão, são métodos privados. Observe que qualquer método público que você adicionar a uma classe de controlador é exposto como uma ação do controlador automaticamente (você deve ter cuidado com isso, pois uma ação do controlador pode ser invocada por qualquer pessoa no universo simplesmente digitando a URL certa em uma barra de endereços do navegador).

Há alguns requisitos adicionais que devem ser atendidos por uma ação do controlador. Um método usado como uma ação de controlador não pode ser sobrecarregado. Além disso, uma ação do controlador não pode ser um método estático. Fora isso, você pode usar praticamente qualquer método como uma ação de controlador.

Noções básicas sobre os resultados da ação

Uma ação do controlador retorna algo chamado resultado de ação. Um resultado de ação é o que uma ação do controlador retorna em resposta a uma solicitação do navegador.

A estrutura ASP.NET MVC dá suporte a vários tipos de resultados de ação, incluindo:

  1. ViewResult – Representa HTML e marcação.
  2. EmptyResult – Não representa nenhum resultado.
  3. RedirectResult – Representa um redirecionamento para uma nova URL.
  4. JsonResult – Representa um resultado de Notação de Objeto JavaScript que pode ser usado em um aplicativo AJAX.
  5. JavaScriptResult – Representa um script JavaScript.
  6. ContentResult – Representa um resultado de texto.
  7. FileContentResult – Representa um arquivo para download (com o conteúdo binário).
  8. FilePathResult – Representa um arquivo para download (com um caminho).
  9. FileStreamResult – Representa um arquivo para download (com um fluxo de arquivos).

Todos esses resultados de ação herdam da classe ActionResult base.

Na maioria dos casos, uma ação do controlador retorna um ViewResult. Por exemplo, a ação do controlador de índice na Listagem 2 retorna um ViewResult.

Listagem 2 - Controllers\BookController.cs

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

namespace MvcApplication1.Controllers
{
    public class BookController : Controller
    {
        public ActionResult Index()
        {
            // Add action logic here
            return View();
        }
    }
}

Quando uma ação retorna um ViewResult, HTML é retornado para o navegador. O método Index() na Listagem 2 retorna uma exibição chamada Index para o navegador.

Observe que a ação Index() na Listagem 2 não retorna um ViewResult(). Em vez disso, o método View() da classe base controller é chamado. Normalmente, você não retorna um resultado de ação diretamente. Em vez disso, você chama um dos seguintes métodos da classe base do Controlador:

  1. Exibição – Retorna um resultado da ação ViewResult.
  2. Redirecionamento – retorna um resultado da ação RedirectResult.
  3. RedirectToAction – Retorna um resultado da ação RedirectToRouteResult.
  4. RedirectToRoute – Retorna um resultado da ação RedirectToRouteResult.
  5. Json – Retorna um resultado de ação JsonResult.
  6. JavaScriptResult – Retorna um JavaScriptResult.
  7. Conteúdo – Retorna um resultado da ação ContentResult.
  8. Arquivo – Retorna um FileContentResult, FilePathResult ou FileStreamResult, dependendo dos parâmetros passados para o método.

Portanto, se você quiser retornar um Modo de Exibição para o navegador, chame o método View(). Se você quiser redirecionar o usuário de uma ação de controlador para outra, chame o método RedirectToAction(). Por exemplo, a ação Details() na Listagem 3 exibe um modo de exibição ou redireciona o usuário para a ação Index(), dependendo se o parâmetro de ID tem um valor.

Listagem 3 – CustomerController.cs

using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    public class CustomerController : Controller
    {
        public ActionResult Details(int? id)
        {
            if (!id.HasValue)
                return RedirectToAction("Index");

            return View();
        }

        public ActionResult Index()
        {
            return View();
        }

    }
}

O resultado da ação ContentResult é especial. Você pode usar o resultado da ação ContentResult para retornar um resultado de ação como texto sem formatação. Por exemplo, o método Index() na Listagem 4 retorna uma mensagem como texto sem formatação e não como HTML.

Listagem 4 - Controllers\StatusController.cs

using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    public class StatusController : Controller
    {
        public ActionResult Index()
        {
            return Content("Hello World!");
        }
    }
}

Quando a ação StatusController.Index() é invocada, uma exibição não é retornada. Em vez disso, o texto bruto "Olá, Mundo!" é retornado ao navegador.

Se uma ação do controlador retornar um resultado que não seja um resultado de ação - por exemplo, uma data ou um inteiro - o resultado será encapsulado em um ContentResult automaticamente. Por exemplo, quando a ação Index() do WorkController na Listagem 5 é invocada, a data é retornada como um ContentResult automaticamente.

Listagem 5 – WorkController.cs

using System;
using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    public class WorkController : Controller
    {
        public DateTime Index()
        {
            return DateTime.Now;
        }
    }
}

A ação Index() na Listagem 5 retorna um objeto DateTime. A estrutura ASP.NET MVC converte o objeto DateTime em uma cadeia de caracteres e encapsula o valor DateTime em um ContentResult automaticamente. O navegador recebe a data e a hora como texto sem formatação.

Resumo

O objetivo deste tutorial era apresentar os conceitos de controladores MVC ASP.NET, ações do controlador e resultados de ação do controlador. Na primeira seção, você aprendeu a adicionar novos controladores a um projeto ASP.NET MVC. Em seguida, você aprendeu como os métodos públicos de um controlador são expostos ao universo como ações do controlador. Por fim, discutimos os diferentes tipos de resultados de ação que podem ser retornados de uma ação do controlador. Em particular, discutimos como retornar um ViewResult, RedirectToActionResult e ContentResult de uma ação do controlador.