t
  • Entreguei o primeiro projeto em #WRT gastei mais tempo configurando o ambiente do que desenvolvendo! A #nokia poderia melhorar isso..

Posts recentes

Comentários recentes

JQuery: ASP.NET MVC com AJAX retornando JSON

Postado por Daniel Fonseca Castro - Tuesday, April 20, 2010 9:00 AM

O JQuery oferece algumas opções para fazer suas solicitações AJAX com retorno JSON, neste post vamos analisar três opções, uma utilizando o método getJSON outra com método post e por fim uma com o método ajax.

Antes de começar os exemplos com JQuery precisamos preparar a aplicação no lado do servidor. Para o modelo vou utilizar o Entity Framework com o banco de dados Northwind , no EF vou manter todas as configurações padrão e vou utilizar a entidade Customers, após as configurações do EF podemos criar o "CustomersController", conforme o código abaixo.

public class CustomersController : Controller
{
    //
    // GET: /Customers/

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


    public ActionResult ActionGetJSON(string termo)
    {
        Entities context = new Entities();
        var resultado = from customer in context.Customers
                        where customer.CompanyName.Contains(termo)
                        select new { CompanyName = customer.CompanyName, CustomerID = customer.CustomerID };
        return Json(resultado, JsonRequestBehavior.AllowGet);
    }

    [HttpPost]
    public ActionResult ActionPostJSON(string termo)
    {
        Entities context = new Entities();
        var resultado = from customer in context.Customers
                        where customer.CompanyName.Contains(termo)
                        select new { CompanyName = customer.CompanyName, CustomerID = customer.CustomerID };
        return Json(resultado);
    }
}

Para montar os nosso exemplos vou utilizar as Actions "ActionGetJSON " e "ActionPostJSON", como você já deve ter percebido uma é acessada via GET e a outra via POST, note que a Action acessada via GET passa dois parâmetros para o método Json que é responsável pela serialização do objeto, se você não passar o segundo parâmetro indicando que o GET é permitido uma execption será lançada.

Agora podemos definir a view Index,veja o código abaixo.

<div>
    <%=Html.TextBox("termo") %>
    <button id="btnBuscarComGetJson">Buscar com método getJSON</button>
    <button id="btnBuscarComPost">Buscar com método  post</button>
    <button id="btnBuscarComAjax">Buscar com método ajax</button>
</div>

<div id="resultado"></div>

Vamos definir os eventos onclick dos três botões abaixo, em um arquivo JavaScript separado do HTML, esse arquivo será criado no decorrer do post.

Método getJSON

O nome do método define o que ele faz, ele faz uma solicitação get e espera um retorno JSON, ele espera três parâmetros url,data e callback.O parâmetro url: define a url da solicitação,data: define os parâmetros da solicitação e callback: define a função que vai tratar o retorno do servidor, a função de callback será executada somente se a solicitação for executada com sucesso.

function btnBuscarComGetJson_click() {
    $.getJSON("/customers/ActionGetJSON/", { termo: $("#termo").val() }, function(data) {
        $("#resultado").empty();
        $("#resultado").append("<table><thead><tr><th>Company Name</th><th>Customer ID</th></tr></thead><tbody id='bodyTable'>");

        $(data).each(function() {
            $("#bodyTable").append("<tr><td>" + this.CompanyName + "</td><td>" + this.CustomerID + "</td></tr>");
        });

        $("#resultado").append("</tbody></table>");
    });
}

O código acima define o método que trata o evento onclick do botão "btnBuscarComGetJson", a função de callback que foi definida de forma anônima escreve uma table dentro da DIV "resultado".

Método post

Esse método também diz o que faz, ele faz uma solicitação post, você pode passar quatro parâmetros para esse método url,data,callback que já conhecemos e dataType.O parâmetro dataType defini o tipo de retorno, ele é um parâmetro opcional caso você não defina o tipo de retorno ele será identificado automaticamente.

function btnBuscarComPost_click() {
    $.post("/customers/ActionPostJSON/", { termo: $("#termo").val() }, function(data) {
        $("#resultado").empty();
        $("#resultado").append("<table><thead><tr><th>Company Name</th><th>Customer ID</th></tr></thead><tbody id='bodyTable'>");

        $(data).each(function() {
            $("#bodyTable").append("<tr><td>" + this.CompanyName + "</td><td>" + this.CustomerID + "</td></tr>");
        });

        $("#resultado").append("</tbody></table>");
    },"json");
}

O método acima define a função que vai tratar o evento onclick do botão "btnBuscarComPost", ele é muito parecido com o método "getJSON", a única diferença é o quarto parâmetro que foi definido como JSON.

Método ajax

O método ajax é o mais completo de todos, ele recebe apenas um parâmetro que é um objeto com todas configurações, para esse exemplo eu vou definir um objeto com sete propriedades, você pode ver a lista completa de opção na documentação http://api.jquery.com/jQuery.ajax/

function btnBuscarComAjax_click() {
    $.ajax({
        url: "/customers/ActionPostJSON/",
        data: { termo: $("#termo").val() },
        type:"post",
        dataType: "json",
        beforeSend: function(XMLHttpRequest) {
            alert('Inicio....');
        },
        error: function(XMLHttpRequest, textStatus, errorThrown) {
            alert('Erro....');
        },
        success: function(data, textStatus, XMLHttpRequest) {
            $("#resultado").empty();
            $("#resultado").append("<table><thead><tr><th>Company Name</th><th>Customer ID</th></tr></thead><tbody id='bodyTable'>");

            $(data).each(function() {
                $("#bodyTable").append("<tr><td>" + this.CompanyName + "</td><td>" + this.CustomerID + "</td></tr>");
            });

            $("#resultado").append("</tbody></table>");
        }
    });
}

O método acima define a função que vai tratar o evento onclick do botão "btnBuscarComAjax", o objeto de configuração passado como parâmetro para a função ajax possui sete propriedades:

url :define a url da solicitação.

data: defini os parâmetros.

type: define o tipo de solicitação os mais comuns são GET ou POST.

dataType: define o tipo de retorno os mais comuns são xml, json, script, ou html.

beforeSend: define a função que será executada antes da solicitação, você pode utilizar esse método para fazer confirmações e validações, essa função pode ser utilizada também para mostrar um modal com uma animação ou um simples "Aguarde...".

error: define a função que será executada caso ocorra algum erro na solicitação.

success: define a função que vai tratar o resultado quando a função for executada com sucesso.

Para finalizar falta apenas adicionar o código que registra o evento click para os três botões.

$(document).ready(function() {
    $("#btnBuscarComGetJson").click(btnBuscarComGetJson_click);
    $("#btnBuscarComPost").click(btnBuscarComPost_click);
    $("#btnBuscarComAjax").click(btnBuscarComAjax_click);
});

Acho que deu para perceber que o método ajax é o mais flexível de todos, a partir deste método você pode criar rotinas especificas para sua aplicação, por exemplo, você pode criar um método que utiliza o método ajax e colocar um loading padrão para todas solicitações, colocar uma mensagem de erro padrão,tratar o resultado de forma padrão em fim as possibilidades são muitas.

Os método getJSON e post são excelentes opções, mais por padrão eles não tem suporte a métodos auxiliares ,por exemplo, se eu quiser fazer algum tratamento antes das minhas solicitações ou tratar erros eles não possui definições para isso, você poderia utilizar métodos globais que o JQuery disponibiliza para resolver esse problema, mais isso é assunto para outro post.

Baixe aqui o fonte em C# ou VB.NET

Daniel Fonseca Castro

Currently rated 5.0 by 3 people

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Related posts

  • Antonio Gomes de Castro Jr
    Antonio Gomes de Castro Jr
    26 Apr 2010 8:37 AM
    Daniel,

    Excelente post.

    Creio que a tendência das aplicações Web deverão seguir esse modelo, ou seja chamadas ajax a action methods das controladoras.
  • Daniel Fonseca Castro
    Daniel Fonseca Castro
    26 Apr 2010 8:40 PM
    Olá Antonio,

    Com ASP.NET MVC isso é bem comum, seria legal ver esse tipo de abordagem em ASP.NET Web Form também!

    Abraços,
    Daniel Fonseca Castro
  • 1000ton
    1000ton
    17 Jun 2010 12:57 PM
    Kra asp.net MVC + jQuery + JSON é uma das coisas mais fantásticas q ja vi na vida. Tem hora q eu mostro pro pessoal eles nem acreditam kkkk show D+
  • mateus
    mateus
    17 Jun 2010 1:23 PM
    Muito bom seu Post, gostei banstante.
  • Leandro Prado
    Leandro Prado
    19 Jun 2010 12:40 PM
    Muito bom seu exmplo... salvou algumas horas do meu trabalho!

    Parabéns!

    Leandro Prado

Add comment


 

  Country flag