Como chamar uma função do servidor (server.side) utilizando javascript e Microsoft ASP.NET Ajax 1.0 (Atlas)
Descrição do artigo publicado no aspneti.com, cada artigo com seu resumo
|
Artigo recomendado para Visual Studio 2005 SP1 e Microsoft Ajax 1.0 |
Hoje aprenderemos como usar a propriedade EnablePageMethods do controle ScriptManager e trabalhar com a biblioteca Sys.Net.PageMethod oferecida pelo Microsoft ASP.NET Ajax 1.0 para utilização em conjunto com a linguagem Javascript.
Introdução:
Muitos tĂȘm essa necessidade de interagir com as funçÔes e classes server-side do ASP.NET utilizando o Ajax (antigo Atlas) utilizando a linguagem Javascript. Por falta de um exemplo claro e material para estudo sobre esse assunto especĂfico, muitas pessoas acabam recorrendo a outros componentes e bibliotecas Ajax encontradas no mercado. Eu mesmo jĂĄ me deparei com aplicativos utilizando duas âdllâsâ (Ajax), onde o aplicativo inteiro utilizava Microsoft ASP.NET Ajax e, por uma necessidade especĂfica, utilizou outra biblioteca Ajax
Codificando:
Para iniciar nosso artigo, abra o Visual Studio.NET SP1 e crie um Novo Projeto > C# > ASP.NET Web Application com o nome de PageMethod [figura 1]; depois abra o Web Form padrão (Default.aspx) e arraste um controle do tipo ScriptManager [figura 2] do Ajax, feito isso adicione dois botÔes da categoria HTML Controls Input (Submit) e crie um DIV no HTML com o id = ResultId ou um Label para o Form também com id = ResultId.

Figura 1 â Criando um Novo Projeto > C# > ASP.NET Web Application utilizando C#

Figura 2 â Adicionando um controle do tipo ScriptManager ao Form

Figura 3 â Adicionando um controle do tipo Input (Submit) da categoria HTML Controls ao Form

Veja abaixo na listagem 1 como ficou o HTML completo do Form que serĂĄ usado no nosso exemplo:
|
<html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>Page Methods - ScriptManager(Microsoft Ajax)</title> </head> <body> <h2>Usando PageMethods com Session</h2> <h4>Utilizando javascript para acessar valores "server side" como Session, ConfiguraçÔes do Web.Config etc ou invocar funçÔes do Code Behind!</h4> <form id="form1" runat="server"> <asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true"> <Scripts> <asp:ScriptReference Path="PageMethod.js"/> </Scripts> </asp:ScriptManager> </form> <center> <table> <tr align="left"> <td> Escrevendo a data e hora atual <td> <input type="Button" onclick="SetSessionValue('SessionValue', Date())" value="Salvar" /> </td> </tr> <tr align="left"> <td> Recuperando a data e hora armazenados na Sessão:</td> <td> <input type="Button" onclick="GetSessionValue('SessionValue')" value="Recuperar" /> </td> </tr> </table> </center> <hr/> <span style="background-color:Aqua;" id="ResultId"></span> </body> </html> |
Com o HTML completo conforme listagem 1, iremos fazer as devidas configuraçÔes necessårias. Aos botÔes Input (Submit) adicione o evento onclick e faça a chamada à função javascript que se comunicarå com a função do servidor que serå responsåvel pela criação e recuperação do valor da Sessão, veja como ficarå cada controle na listagem 2:
|
Input 1 Type=âButtonâ Onclick=âSetSessionValue(âSessionValueâ),Date())â Input 2 Type=âButtonâ Value=âRecuperarâ Onclick=âGetSessionValue(âSessionvalueâ)â |
Vamos para as configuraçÔes do ScriptManager, mas antes crie um novo arquivo do tipo Jscript File (Projeto > Add > New Item > Jscript File) [figura 5] com o nome de PageMethod.js [figura 6] e coloque o código Javascript da listagem 3:

Figura 5 â Criando um novo arquivo
Figura 6 â Escolhendo o tipo âJScript Fileâ e nomeando-o conforme usaremos no projeto
|
// PageMethods.js var displayElement; // Criando variĂĄveis globais e executando e criando a SessĂŁo. function pageLoad() { displayElement = $get("ResultId"); PageMethods.SetSessionValue("SessionValue", Date(), OnSucceeded, OnFailed); } // Recuperar o valor da SessĂŁo. function GetSessionValue(key) { PageMethods.GetSessionValue(key, OnSucceeded, OnFailed); } //Salvando a Data e hora atual na SessĂŁo. function SetSessionValue(key, value) { PageMethods.SetSessionValue(key, value, OnSucceeded, OnFailed); } // Função de retorno caso seja invocado com sucesso function OnSucceeded(result, userContext, methodName) { if (methodName == "GetSessionValue") { displayElement.innerHTML = "Valor atual da SessĂŁo: " + result; } } // Função de retorno caso algo dĂȘ errado function OnFailed(error, userContext, methodName) { if(error !== null) { displayElement.innerHTML = "Ocorreu um erro: " + error.get_message(); } } if (typeof(Sys) !== "undefined") Sys.Application.notifyScriptLoaded(); |
Agora sim, Clique no Controle âScriptManagerâ e em Propriedades, clique em Scripts e adicione uma nova referĂȘncia ao arquivo Javascript recĂ©m criado conforme figura 7. Reparem a diferença de um cĂłdigo javascript comum com o cĂłdigo mostrado da listagem 3 bonde podemos perceber o uso de mĂ©todo da biblioteca do Ajax (Sys.Net), vemos trechos como: âdisplayElement = $get("ResultId")â e itens especĂficas como: âerror.get_message()â e âSys.Application.notifyScriptLoaded()â.

Figura 7 â Adicionando a referĂȘncia ao arquivo Javascript.
Ao concluir, vå até o código (arquivo .cs) da pågina ASP.NET e vamos trabalhar com as funçÔes que serão chamadas pelo javascript para iteração com a Sessão do aplicativo.
Veja como ficou o cĂłdigo do Web Form na listagem 4 abaixo:
|
using System; using System.Data; using System.Configuration; using System.Collections; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using System.Web.Services; namespace PageMethod { public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } [WebMethod] // Recuperando o valor da SessĂŁo. public static string GetSessionValue(string key) { return (string)HttpContext.Current.Session[key]; } [WebMethod] // Salvando o valor da SessĂŁo. public static string SetSessionValue(string key, string value) { HttpContext.Current.Session[key] = value; return (string)HttpContext.Current.Session[key]; } } } |
Percebam o uso da identificação [WebMethod] antes de cada função que serĂĄ usada e da importação da classe âSystem.Web.Servicesâ. Isso Ă© necessĂĄrio por que a biblioteca do Ajax (Sys.Net.PageMethod) utiliza a classe System.Web.Services e seus mĂ©todos para compartilhar os mĂ©todos server-side e tornĂĄ-los acessĂveis atravĂ©s do cĂłdigo âClient sideâ (Javascript).
ConfiguraçÔes do Web.Config (Microsoft ASP.NET Ajax 1.0)
Para finalizar, após tudo isso não podemos nos esquecer das configuraçÔes do Web.Config para que o Microsoft ASP.NET Ajax 1.0 funcione corretamente. Caso crie um novo projeto usando um Template de Projeto com Ajax não precisarå das configuraçÔes da listagem 5:
|
<?xml version="1.0"?><configuration> <configSections> <sectionGroup name="system.web.extensions" type="System.Web.Configuration.SystemWebExtensionsSectionGroup, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"> <sectionGroup name="scripting" type="System.Web.Configuration.ScriptingSectionGroup, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"> <section name="scriptResourceHandler" type="System.Web.Configuration.ScriptingScriptResourceHandlerSection, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="false" allowDefinition="MachineToApplication"/> <sectionGroup name="webServices" type="System.Web.Configuration.ScriptingWebServicesSectionGroup, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"> <section name="jsonSerialization" type="System.Web.Configuration.ScriptingJsonSerializationSection, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="false" allowDefinition="Everywhere"/> <section name="profileService" type="System.Web.Configuration.ScriptingProfileServiceSection, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="false" allowDefinition="MachineToApplication"/> <section name="authenticationService" type="System.Web.Configuration.ScriptingAuthenticationServiceSection, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="false" allowDefinition="MachineToApplication"/> </sectionGroup> </sectionGroup> </sectionGroup> </configSections> <appSettings/> <connectionStrings/> <system.web> <compilation debug="true"> <assemblies> <add assembly="System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> </assemblies> </compilation> <authentication mode="Windows"/> <pages> <controls> <add tagPrefix="asp" namespace="System.Web.UI" assembly="System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/> </controls> </pages> <httpHandlers> <remove verb="*" path="*.asmx"/> <add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/> <add verb="*" path="*_AppService.axd" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/> <add verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" validate="false"/> </httpHandlers> <httpModules> <add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/> </httpModules> </system.web> <system.webServer> <validation validateIntegratedModeConfiguration="false"/> <modules> <add name="ScriptModule" preCondition="integratedMode" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/> </modules> <handlers> <remove name="WebServiceHandlerFactory-Integrated"/> <add name="ScriptHandlerFactory" verb="*" path="*.asmx" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/> <add name="ScriptHandlerFactoryAppServices" verb="*" path="*_AppService.axd" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/> <add name="ScriptResource" preCondition="integratedMode" verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/> </handlers> </system.webServer> </configuration> |
ComentĂĄrio
Ultimamente ando lendo em muitos fĂłruns usuĂĄrios afirmando que o aplicativo que utiliza MS Ajax 1.0 funcione corretamente, o servidor de hospedagem terĂĄ que o ter o componente instalado, essa afirmação nĂŁo Ă© correta. O que acontece Ă© que nas primeiras versĂ”es do Atlas, sua instalação nĂŁo adicionava o Assembly ao GAC (Global Assembly Cache) e tambĂ©m quando se adicionava um objeto do Atlas no Web Form a referĂȘncia a dll era adicionada e sua propriedade Copy Local era automaticamente marcada como True, o que nĂŁo acontece nas Ășltimas versĂ”es do Atlas agora chamado de Microsoft ASP.NET Ajax, onde o mesmo Ă© adicionado ao GAC na sua instalação e a propriedade em questĂŁo nĂŁo Ă© marcada como True.
Para resolvermos esse problema podemos simplesmente selecionar o Assembly System.Web.Extensions no Solution Explorer e em propriedades configurar a propriedade Copy Local = True, dessa forma ao compilar o projeto a dll Ă© automaticamente copiada para a pasta Bin do projeto eliminando a necessidade de se ter o componente instalado no servidor [figura 8].

Figura 8 â Propriedades do Assembly
Com esse artigo aprendemos a utilizar o Microsoft Ajax para chamar funçÔes server-side atravĂ©s da linguagem Javascript. O uso desse exemplo pode ser muito Ăștil, espero que gostem e aproveitem o artigo, qualquer dĂșvida entre em contato, atĂ© o prĂłximo.
CĂłdigo fonte:
[http://www.i4design.com.br/artigos/PageMethods.rar]
ReferĂȘncias:
Documentação do Microsoft ASP.NET Ajax 1.0:
[http://ajax.asp.net/docs/ClientReference/Global/default.aspx]
Requisitos:
Microsoft ASP.NET Ajax 1.0:
[http://ajax.asp.net/Default.aspx]
Atualização SP1 para o Visual Studio 2005:
[http://msdn2.microsoft.com/pt-br/vstudio/bb265237.aspx]
Fabiano Vitucci Santiago
(Analista de Sistemas da i4 Design SoluçÔes e das Faculdades Santo Agostinho)
Related articles
How to create a Short video page?
Today, I will show you how to create a short video
Why do I need to use asp fallback?
See the code in practice
How to use asp-fallback-href?
using technology .NET
Session has not been configured for this application or request error in C# Razor applications
Showing code step by step
Como fazer uma tabela no C# com paginação, busca e ordenação? [vídeo]
Um passo a passo que te ajuda
Razor Page - PageRoute
Veja como fazer uma rota de página quefacilitar...
Fabiano Vitucci Santiago