in ASP.NET

ActionResult no ASP.NET MVC

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
  • luiz

    Olá, tenho um projeto mvc2 e estou tentando retornar um javascript, que contem um simples texto para adicionar a uma div sem recarregar a pagina. O unico resultado que consegui foi ele retornar o script em forma de texto apenas, como se não tivesse sido executado e sim interpretado como um texto qualquer. Você poderia me ajudar com este problema?

  • http://www.rodolfofadino.com.br/ Rodolfo Fadino

    Luiz, vc quer gerar um js dinamicamente com uma Action?
    postei um exemplo de como fazer isso:

    https://gist.github.com/rodolfofadino/6237668

    abs

  • luiz

    Esse exemplo funcionou sim mas não é o que eu estou tentando fazer, pelo q vi ele mostra o alerta apenas quando a pagina é carregada.
    A minha idéia é que quando chegar um email, apareça uma mensagem no cabeçalho da pagina, mas sem recarregar a página. Para isso eu ia fazer uma thread para ficar verificando o email(isso já esta pronto), e quando um novo email chegar ele chamar uma action conforme abaixo.

    Veja aqui neste site http://mps.somee.com (abrir com chrome), ao lado da parte de Novidades tem um link “Verifica Email”. Ele retorna o texto do javascript.

    E no meu código está assim:
    Na view tem :

    No controller tem: public JavaScriptResult VerificaEmail()
    {
    return JavaScript(“$(‘#novoemail’).html(‘ Nova mensagem de email!’);”);
    }

    Não sei qual o erro estou cometendo.

  • http://www.rodolfofadino.com.br/ Rodolfo Fadino

    Luiz, seu controller está ok, ele retorna um js. Entretanto você está chamando ele do cliente side de maneira errada. Da uma estudada em elementos html ( em especifico) e da uma estudada em JS e Ajax com jQuery.