Obrigado por visitar a devmedia.com.br!

Precisamos de você para divulgar nossos vídeos e cursos gratuitos para a comunidade.

Se você gosta da devmedia.com.br por favor dê-nos o seu clique para o Google+ e ajude outros desenvolvedores ao redor do mundo.



Obrigado por seu apoio!
Equipe DevMedia

sair sem compartilhar (x)
DevMedia - asp.net, Java, Delphi, SQL e web Design, tudo em um só lugar!
Bem vindo a DevMedia!
LOGIN:     SENHA:

jQuery com Asp.Net Ajax: Consumindo um Web Service

Aprenda como consumir um web service com jquery

Antes de começar a falar do assunto propriamente dito, irei falar rapidamente sobre o que me motivou a começar a estudar asp.net ajax com jquery.  Atualmente, estamos desenvolvendo um sistema consideradamente grande na empresa, e fiquei responsavel por um módulo que é muito grande, onde temos fórmularios gigantes, com dados e mais dados, em vários pontos do mesmo precisamos fazer chamadas assincronas ao servidor. E qual o problema? Faziamos tudo com updatepanel e com outros controles do ajaxcontroltoolkit. Quando finalizamos o módulo, a primeira reclamação feita pelo usuário foi que as chamadas assincronas estavam lentas pois as páginas estavam muito carregadas. Não sei se vocês tiveram a curiosidade de olhar, mas o updatepanel em um request trás uma quantidade de ‘lixo’ enorme. Então começamos a estudar possiveis soluções,  uma delas foi utilizar jquery para nos ajudar no desenvolvimento, e desde o momento que decidimos utilizar jquery, a equipe não para de se fascinar a cada dia com o poder da biblioteca. E com certeza  a utilização de jquery no nosso projeto é um dos grandes motivos para o sucesso do mesmo, pois, atualmente, ele está bem rápido, dando respostas que antes aconteciam em 5s, agora em 1s.

Então, neste primeiro post vamos falar sobre como consumir um WebService em Asp.Net Ajax com jQuery.

1.O que nosso exemplo irá fazer?

Para servir como exemplo, iremos fazer um projeto onde carregaremos controles de usuarios (user controls) de maneira assincrona.
Ou seja, o usuário ira clicar em um botão “carregar”. O mesmo irá disparar uma função javascript, que esta por sua vez irá chamar um método do web service de maneira assincrona, e este irá carregar e retornar o controle para o cliente.
Então vamos ao que interessa, vamos começar a construir esta aplicação.

2. Código HTML

O código HTML será bastante simples, terá apenas um  botão HTML que tem a finalidade de carregar o user control e terá uma div que é o espaço onde será exibido o nosso user control carregado dinamicamente.

<div id="resposta">
div>
<
input type="button" id="loadControl" value="carregar user control" />

3. Código JavaScript

Nesta parte é que teremos boa parte da lógica para carregar o controle. É aqui que assinamos a função que será disparada quando o botão for clicado. É daqui também que iremos chamar o web service e logo apos adicionaremos a resposta do WS na div “resposta”.

<script language="javascript" type="text/javascript">

$(document).ready(function() {
$("#loadControl").click(function() {
var params = '{}';
$.ajax({
type: "POST",
url: "UserControlsService.asmx/GetUserControl",
data: params,
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(msg, status) {
$("#resposta").html(msg.d);
},
error: function(xhr, msg, e) {
alert(msg);
}
});
});
});

script>

Explicando a finalidade de cada propriedade:

  • type: tipo da requisição, ou seja, se vai acontecer via get ou post.
  • url: Caminho do web service, e método que irei acessar. No meu caso o WS é “UserControlsService.asmx” e o método que irei acessar é “GetUserControl”
  • data: dados que irei passar para o método (os dados devem ser passados no formato json)
  • contentType: mais informação sobre o conteúdo que estará envolvido na trasmissão de dados entre cliente e servidor.
  • dataType: Logo à cima falei que os dados deveriam ser passados em json. Isto deve acontecer pois o tipo do dado definido por mim foi “json”
  • success/error: o que deve ser feito quando acontecer determinada coisa, ou seja, quais as ações que serão tomadas quando a comunicação com o WS ocorrer com sucesso ou quando houver erro.

4.Criando o WS e carregando o user control.

Antes de tudo, devemos assinar nossa classe com o atributo “ScriptService”. Após esse passo, já podemos criar nossos métodos que irão retornar ‘qualquer coisa’ para o código javascript.

No meu caso, como eu quero carregar um user control, então utilizo o seguinte código:

   [WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public string GetUserControl()
{
Page page = new Page();
HtmlForm form = new HtmlForm();
UcLogin login = (UcLogin)page.LoadControl("UcLogin.ascx");
form.Controls.Add(login);
page.Controls.Add(form);
StringWriter sw = new StringWriter();
HttpContext.Current.Server.Execute(page, sw, false);
string retorno = sw.ToString();
sw.Close();
return LimparHtml(retorno);
}

private static string LimparHtml(string html)
{
return Regex.Replace(html, @"<[/]?(form|[ovwxp]:\w+)[^>]*?>", "", RegexOptions.IgnoreCase);
}

Não irei fazer nenhum comentário de como eu fiz para carregar o controle, pois falarei disso em um proximo post, mas caso alguem possua alguma dúvida é só postar. Nesse post a meta é entender como consumir um web service com jquery e asp.net.

5.Criando o user control

Crie o user control, que no meu caso irá se chamar “UCLogin.ascx” , e coloque qualquer coisa como seu conteudo. No meu caso coloquei apenas duas labels e duas textbox, como o código a seguir:

<table>
<
tr>
<
td>
Login
td>
<
td>
<
asp:TextBox ID="txtLogin" runat="server">asp:TextBox><br />
td>
tr>
<
tr>
<
td>
Senha
td>
<
td>
<
asp:TextBox ID="txtSenha" runat="server">asp:TextBox>
td>
tr>
table>

6.Finalizando

Se você rodar e testar a aplicação, você verá que o user control já está sendo carregado de maneira assincrona.


Abraço a todos.


Este artigo encontra-se, também, em meu blog: http://fpimentel88.wordpress.com






    13 COMENTÁRIOS

[Fechar]

Este post é fechado - você precisa ter acesso ao post para incluir um comentário.



Valdir Da Rosa Silva
Felipe, muito interessante sua dica neste post porém brother copiei e colei o seu código, inclusive tem umas tags que não estão fechadas mas em fim ajustei, usei os mesmos nomes de todos os arquivos mas quando clico no botão pra carregar o controle a mensagem de retorno é simplesmente "error" e nada além disso. Coloquei um breakpoint no código do webservice mas nem entra no método.

Cara você poderia disponibilizar um exemplo funcionando desta sua dica pois tenho algumas páginas de um sistema que vai ser uma boa pedida trabalhar da forma que você demonstrou neste post.

Abraço.


em 2/10/2011 20:58 - Responder

 

Valdir Da Rosa Silva
Brother quanto ao download faltou atenção minha pois tem o link pra download dos arquivos porém mesmo abrindo o seu projeto sem alterar nada continua retornando o a mensagem "error".

Eu estou usando VS 2010 com framework 4.0 alguma incompatibilidade com o código apresentado no exemplo?

Abraço.


em 2/10/2011 21:11 - Responder

 

  Luiz Agnelo C. Maia
Valdir, nos de mais informações sobre o erro.
Quando ocorre e qual mensagem completa para que possamos tentar te ajudar....

[]s


em 14/10/2011 16:29 - Responder
 

Diego Pontes
Felipe,

Parabéns pelo post!

Existe alguma maneira de mesmo consumindo um usercontrol com jquery/ajax, você manter os eventos postback... Pois ao consumir um gridview estaríamos perdendo todo os eventos nele existente. Tentei fazer algo com __DoPostBack, mas sem sucesso. Alguma idéia?


em 19/10/2011 10:44 - Responder

 

  Luiz Agnelo C. Maia
Vc esta carregando o gridView via ajax e o mesmo perde os eventos, é isto?


em 21/10/2011 14:31 - Responder
 

Josélio Antonio De Barros
Como faria para pegar um arquivo html e com o jquery enviar o formulário para um arquivo json quando for enviado o asp.net processar ele e enviar no formato json para que um jquery no mesmo arquivo html possa ler resposta?


em 18/1/2012 14:03 - Responder

 

  Luiz Agnelo C. Maia
Joselio, por favor explique melhor o que precisa para que possamos te ajudar, ok?


em 19/1/2012 09:29 - Responder
 

  Josélio Antonio De Barros
Tenho este código e mais alguns deste tipo que baixei, tudo isso resulta em um json (Cadastrar), que é utilizado por um web service em asp.net que cadastra o usuário e retorna o arquivo json (DadosFa), gostaria de saber se um web service poderia pegar as informações do json(Cadastrar) processar ela e retornar um json (DadosFa) e como poderia fazer este web service?

function EnviaForm(){
var b = new Object();
b.Nome = $(“#nome”).val();
b.Email = $(“#email”).val();
b.DataNascimento = $(“#data_nascimento”).val().substr(6,4)+”-”+$(“#data_nascimento”).val().substr(3,2)+”-”+$(“#data_nascimento”).val().substr(0,2);
b.RG = $(“#rg”).val();
b.Telefone = $(“#telefone”).val();
b.Celular = $(“#celular”).val();
b.Cidade = $(“#cidade”).val();
b.UF = $(“#estado”).val();
if ($(“#senha”).val()!=”"){
b.Senha = $(“#senha”).val()
}
var a = new Object();
a.cad = b;
$.ajax({
/* arquivo Json */
url:”faclube.aspx/Cadastrar”,
type:”POST”,
contentType:”application/json; charset=utf-8″,
dataType:”json”,
data:JSON.stringify(a),
success:function(c){
if (c.d == “OK”){
alert(“Cadastro efetuado com sucesso!nFaça o login para utilizar os serviços do site.”);
$(“#nome”).val(“”);
$(“#email”).val(“”);
$(“#data_nascimento”).val(“”);
$(“#rg”).val(“”);
$(“#telefone”).val(“”);
$(“#celular”).val(“”);
$(“#senha”).val(“”);
parent.$.colorbox.close()
} else {
alert(c.d)
}
},
error:function(f,d,c){
console.log(JSON.stringify(d.responseText))
}
})
};


em 19/1/2012 14:11 - Responder
 

  Luiz Agnelo C. Maia
UM web service sempre retornara um XML no formato designado no WSDL, geralmente um DataSet (se é que podemos falar assim).

Agora, apos receber este XML do ws, vc pode tentar fazer a conversão dele para o formato jSon:

http://davidwalsh.name/convert-xml-json

[]s


em 20/1/2012 09:33 - Responder
 

  Josélio Antonio De Barros
Mas tem como o webservice receber um xml? e dar uma outra resposta tratado com um código C#?


em 20/1/2012 11:21 - Responder
 

  Luiz Agnelo C. Maia
Tem sim, o WS recebe qualquer tipo de parametro, mas se vc "tipar" este parametro, por exemplo se usar um parametro de entrada tipo DataSet, vc perde a compatibilidade com outras plataformas que não tem este tipo de dado, entende?
Logo, o aconselhavel é sempre usar uma string. No seu caso vc pode mandar um XML (string) para o ws e tratar la dentro, o mesmo vai te retornar tambem um XML do qual vc transforma-o para um XMLDocument e trata usando C#.

[]s


em 23/1/2012 10:19 - Responder
 

  Josélio Antonio De Barros
Como faria pra chamar esse XML à variavél. Qual a sintaxe?


em 28/1/2012 14:05 - Responder
 

  Luiz Agnelo C. Maia
http://cbsa.com.br/post/ler-arquivo-xml-usando-xmltextreader-e-xmldocument-em-c---aspnet.aspx


em 31/1/2012 08:01 - Responder
 



[Este post ainda não foi associado a uma sequência]
Autor
Felipe José Fonseca Pimentel

Trabalha como Arquiteto e Consultor independente. É líder do grupo DotNetArchitects PE. Possui mais de 4 anos de experiência com tecnologias .NET. Ministra cursos, palestras e treinamentos sobre a plataforma .NET. Possuindo os títulos de MCP, MCTS e MCPD.


Space do autor
Estatísticas #
Favorito:
Comentários:
Feedback:
Utilidade:
1   0
[Fechar]

Você precisa estar logado para dar um feedback.

Clique aqui para efetuar o login
[Fechar]
Este post está disponível somente para quem possui Créditos DevMedia. (Ele não está associado a nenhuma publicação DevMedia).


  Conheça os planos de créditos DevMedia e visualize esse post agora mesmo!

Plano conveniência – Neste plano este post custa R$ 0,00 (Compre agora)
Esse plano permite que você compre somente um post, pagando por ele seu preço sem desconto.

Plano ocasional: Aqui este post custa: R$ -1,00 (assinante) ou R$ -1,00 (não-assinante)
Este plano é ideal para quem tem interesse em mais de um post. Você compra um mínimo de R$ 50,00 em créditos e ganha, em média, 50% de desconto no preço do post. Compre Créditos agora!

Assinatura de Créditos (Plano econômico) – Aqui este post custa R$ -1,00
Este plano é ideal para quem tem interesse em muitos posts. Com esse plano você compra R$ 180,00 em créditos e ganha, em média, 80% de desconto no preço do post. Assine este plano agora!

> Saiba mais sobre o Sistema de Créditos DevMedia
web-03
DevMedia  |  Anuncie  |  Fale conosco
Hospedagem web por Porta 80 Web Hosting
2012 - Todos os Direitos Reservados a web-03