ASP .NET MVC -  Tipos de retorno dos métodos Action


  No artigo de hoje veremos os tipos de retorno possíveis dos métodos Action dos controladores da ASP .NET MVC 5.
 

Chegou o curso Curso ASP .NET .MVC 5 Vídeo Aulas onde você vai aprender a criar aplicações web dinâmicas usando a ASP .NET MVC 5.

Apesar da referência explícita ao padrão Model-View-Controller no nome, a arquitetura ASP.NET MVC esta essencialmente centrada em um pilar : o controlador.

O controlador governa o processamento de um pedido e orquestra o back-end do sistema (por exemplo, camada de negócios, serviços, camada de acesso aos dados) para pegar os dados para a resposta.

Em seguida, o controlador empacota os dados brutos computados para a solicitação em uma resposta válida para o chamador.

Quando a resposta é uma view, o controlador baseia-se no módulo do motor view (Razor) para combinar dados e modelos de view e gerar o HTML.

Assim, uma classe controller contém métodos que são as conhecido como Actions.

Um método action é utilizado para processar uma requisição HTTP e ele pode conter ou não conter argumentos.

Para criar uma action é preciso definir o método como public sendo que o valor de retorno será uma instância de uma classe que deriva de ActionResult.

Existem diferentes tipos de objetos ActionResult que podem ser retornados por um método Action.

A classe ActionResult é uma classe abstrata que possui diversos sub tipos e temos uma classe apropriada para cada tipo de retorno que é derivada dessa classe. Abaixo vemos os principais tipos de retorno:

Como exemplo vejamos um trecho de código de um método Action muito usado:

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

Observe que embora o tipo de retorno esperado seja um ActionResult estamos retornando uma View() que é um tipo ViewResult.

Mas podemos fazer isso ??

É claro que podemos pois o ViewResult é um subtipo de ActionResult.

Dessa forma você pode usar o tipo de retorno ViewResult para uma view mas pode continuar usar ActionResult para esse tipo de retorno e para os demais subtipos de retorno esperados.

Você pode estar se perguntando:

"Por que temos tantos subtipos ? "   e   "Qual deve ser o tipo de retorno para um método Action ?"

É uma boa prática retornar o subtipo específico, mas, se diferentes caminhos da Action retornarem tipos diferentes então retorne um objeto ActionResult:

public ActionResult Index()
{
   if (condicão)
         return View(); //retorna objeto ViewResult
    else
       return Json("Dados"); //retorna objeto JsonResult
}

Como exemplo vou mostrar a utilização do tipo de retorno FileResult.

Nota: Veja o código desta classe no CodePlex:
http://aspnetwebstack.codeplex.com/SourceControl/changeset/view/913d37658a44#src/System.Web.Mvc/FileResult.cs

FileResult é uma classe abstrata derivada de ActionResult que delega escrita do arquivo no response às subclasses.

Contém um único método abstrato chamado WriteFile que cada subclasse deve implementar.

Esta classe faz o trabalho de adicionar cabeçalhos Content-Type e Content-Disposition no response.

Existem três classes embutidas que implementam FileResult:

  1. FilePathResult

  2. FileContentResult

  3. FileStreamResult.

Veremos a seguir um exemplo prático de utilização desse recurso.

Recursos usados :

Criando o projeto no VS 2013 Express for web

Abra o VS 2013 Express for web e clique em New Project;

A seguir selecione Visual C# -> ASP .NET Web Application;

Informe o nome Mvc_Fileresult e clique no botão OK;

A seguir selecione o template Empty, marque MVC  e clique no botão OK;

Será criado um projeto ASP .NET MVC vazio com a estrutura básica para criarmos o nosso exemplo.

Vamos incluir neste projeto uma pasta chamada Arquivos onde iremos incluir alguns arquivos para teste da nossa aplicação.

Selecione o projeto e no menu PROJECT clique em New Folder e informe o nome Arquivos.

A seguir clique com o botão direito do mouse sobre a pasta Arquivos e a seguir clique em Add -> Existing Item;

Selecione alguns arquivos de diferentes formatos e inclua nesta pasta. Para nossa aplicação eu inclui um arquivo PDF, um TXT, um .WAV , um .RTF.

Criando o controlador HomeController na pasta Controllers

Clique com o botão direito do mouse sobre a pasta Controllers e a seguir clique em Add => Controller;

A seguir selecione o Scaffold : MVC 5 Controller Empty e clique no botão Add;

Digite o nome HomeController na janela Add Controller e clique no botão Add:

Digite o código abaixo para o HomeController:

using System.Web.Mvc;
namespace Mvc_FileResult.Controllers
{
    public class HomeController : Controller
    {
        // GET: Home
        public ActionResult Index()
        {
            return View();
        }
        //classe MediaTypeNames.Application = Especifica o tipo de dados do aplicativo 
        //em um anexo de email.
        public FileResult Download()
        {
            byte[] fileBytes = System.IO.File.ReadAllBytes(@"c:\dados\Tabacaria.txt");
            string fileName = "meuArquivo.txt";
            return File(fileBytes, System.Net.Mime.MediaTypeNames.Application.Octet, fileName);
        }
        public FileResult ArquivoFilePathResult()
        {
            string nomeArquivo = @"c:\dados\SuperDVDVB.pdf";
            string contentType = "application/pdf";
            return new FilePathResult(nomeArquivo, contentType);
        }
        public ActionResult ArquivoPDF()
        {
            return File("~/Arquivos/SuperDVDVB.pdf", "application/pdf");
        }
 
       public ActionResult ArquivoAudio()
        {
            return File("~/Arquivos/Bee_Gees.wav", "audio/x-wav");
        }

        public ActionResult ArquivoRTF()
        {
            return File("~/Arquivos/macoratti.rtf", "application/msword");
        }
    }
}

No controlador HomeController temos definidos 6 métodos Actions conforme abaixo:

1- Criando a view Index

Para criar a view o procedimento é clicar com o botão direito sobre o nome do método Action Index no controlador e a seguir clique em Add View:

Para a view Index selecione o template Empty(without model) e clique no botão Add;

Com isso estamos criando a view tipada Index.cshtml na pasta Views/Home.

A seguir inclua o código abaixo neste arquivo:

<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
</head>
<body>
    <div style="font-family:Algerian"> 
        <h2>Tratanto arquivos com FileResult</h2>
        <ul>
            <li>@Html.ActionLink("Arquivo PDF","ArquivoPDF")</li>
            <br />
            <li>@Html.ActionLink("Arquivo Audio", "ArquivoAudio")</li>
            <br />
            <li>@Html.ActionLink("Arquivo RTF", "ArquivoRTF")</li>
            <br />
            <li>@Html.ActionLink("Arquivo FilePathResult", "ArquivoFilePathResult")</li>
            <br />
            <li>@Html.ActionLink("Arquivos Genéricos", "Download")</li>
        </ul>
    </div>
</body>
</html>

Nesta view estamos usando o HTML Helper ActionLink para criar links que acionam os respectivos métodos Action do controlador Home:

Executando iremos obter o seguinte resultado:


Pegue o projeto completo aqui: Mvc_FileResult.zip (sem as referências)

E os que são de Cristo crucificaram a carne com as suas paixões e concupiscências.
Gálatas 5:24

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Quer aprender a criar aplicações Web Dinâmicas usando a ASP .NET MVC 5 ?

 

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti