// Rodolfo Fadino

/* LIFE RUNS ON CODE */

O ASP.NET MVC é uma framework de desenvolvimento web extremamente poderosa, nela é possível customizar, estender e criar nossas próprias implementações, tendo assim um controle total de nossas aplicações.

Sem dúvida o ActionResult faz parte do core do ASP.NET MVC, desde a sua primeira versão o ASP.NET MVC vem evoluindo e criando vários tipos que derivam dele, entender o funcionamento dessa parte do ASP.NET MVC ajuda a escolhermos a melhor solução para cada parte de nossa aplicação.

Um action result é o tipo de retorno de um método de um controller, ou melhor, o tipo de retorno de uma action. Actions podem retornar diversas coisas, como: models para views, file stream, redirects, javascript, etc.

Existem diversos tipos que são derivados do ActionResult:

No ASP.NET MVC 3.0 existem os seguintes tipos nativos:

Além desses diversos tipos é muito fácil cria nosso própio tipo de retorno para uma Action.
Nesse exemplo eu criei uma classe chamada DownloadResult que retorna um arquivo html para download.
Para isso eu precisei que ela herdasse de ActionResult, coloquei duas propriedades e criei um override do método ExecuteResult:
public class DownloadResult : ActionResult
{
    public string FileName { get; set; }
    public string Path { get; set; }

    public override void ExecuteResult(ControllerContext context)
    {
        context.HttpContext.Response.Buffer = true;
        context.HttpContext.Response.Clear();
        context.HttpContext.Response.AddHeader("content-disposition", "attachment; filename=" + FileName);
        context.HttpContext.Response.ContentType = "text/html";
        context.HttpContext.Response.WriteFile(context.HttpContext.Server.MapPath(Path));
    }
}
Para utilizar essa classe como tipo de retorno de uma Action eu só precisarei criar um Action (nesse caso chamei de GetHtml) que possui como retorno o tipo DownloadResult, nessa Action eu preciso instanciar o tipo de retorno e setar os parâmetros necessários:
public DownloadResult GetHtml(long id)
{
    var html = new Html();
    html.Load(id);

    return new DownloadResult() { FileName = html.FileName, Path = html.Path) };
}
Bom  espero que este post seja útil,
estou a disposição para dúvidas, criticas e sugestões
abs
Rodolfo
ASP.NET