Setando e Recuperando Sessão através do ASP.NET AJAX Client

Salve desenvolvedores,

Eba, ASP.NET de novo! A dica de hoje é para trabalhar com o framework Cliente do ASP.NET AJAX 1.0, setando a data e a hora atual em uma variável de sessão e depois recuperando o valor dessa sessão através de javascript no cliente.

Primeiro, vou colocar o código de apresentação (tags), que inicia com a diretiva de página Page e seus atributos seguido da declaração do assembly System.Web.Extensions, para utilização do ASP.NET AJAX. Vamos seguindo o fluxo normal da página até chegarmos no nosso ScriptManager, que deverá conter o seguinte atributo EnablePageMethods=”true”.

Depois disso, vamos aos controles ASP.NET. Temos:

  • 1 Label (lblTexto)
  • 2 Botões (btnAtualizar e btnLer)

Reparem que os botões ASP.NET não tem o atributo OnClick, pois não faz nenhuma referência à evento (servidor) diretamente. Colocamos apenas uma chamada javascript normal para um método javascript, que fará a chamada assíncrona. Após chamar o nosso método Get ou Set javascript, colocamos o código return false; para não haver nenhum post para o servidor desnecessariamente.

Indo para o código JavaScript, utilizaremos o objeto PageMethods para fazer as chamadas assíncronas aos métodos estáticos no seridor. Como não existe nenhum paramêtro para enviar ao servidor, apenas passamos as funções de retorno em caso de sucesso e falha. Caso ocorra tudo bem e o método invocado tenha sido o GetSession, recupera o objeto Label e escreve o valor da sessão.

Código Default.aspx:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<%@ Register Assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" Namespace="System.Web.UI" TagPrefix="asp" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Teste Sessão</title>
</head>
<body>
    <form id="form1" runat="server">
        <asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true" />
        <div>
            <asp:UpdatePanel ID="UpdatePanel1" runat="server" >
                <ContentTemplate>
                    <asp:Label ID="lblTexto" runat="server" />
                    <asp:Button ID="btnAtualizar" runat="server" Text="Atualizar Sessão" OnClientClick="SetSession(); return false;" />
                    <asp:Button ID="btnLer" runat="server" Text="Ler Sessão" OnClientClick="GetSession(); return false;" />
                </ContentTemplate>
            </asp:UpdatePanel>
        </div>
    </form>

    <script type="text/javascript">

        /* ASYNC */

        function SetSession()
        {
            // Chamada assíncrona
            PageMethods.SetSession(OnSucceeded, OnFailed);
        }

        function GetSession()
        {
            // Chamada assíncrona
            PageMethods.GetSession(OnSucceeded, OnFailed);
        }

        function OnSucceeded(result, userContext, methodName)
        {
            if (methodName == "GetSession")
            {
                var label = $get('<%=lblTexto.ClientID %>');
                label.innerHTML = result;
            }
        }

        function OnFailed(error, userContext, methodName)
        {
            if(error !== null)
                alert(error.get_message());
        }

        if (typeof(Sys) !== "undefined") Sys.Application.notifyScriptLoaded();

    </script>
</body>
</html>

No code-behind da nossa página, vamos adicionar uma propriedade (MinhaSessao) retornando ou setando uma string em uma sessão. Nesse caso, por ser estática, como o método, devemos recuperar a sessão através da HttpContext.Current.Session. Lembrando de adicionar o atributo [WebMethod] em cima do método e declarar o namespace System.Web.Services.

Código Default.aspx.cs:

using System;
using System.Web;
using System.Web.Services;

public partial class _Default : System.Web.UI.Page
{
    public static string MinhaSessao
    {
        get { return (string)HttpContext.Current.Session["MinhaSessao"]; }
        set { HttpContext.Current.Session["MinhaSessao"] = value; }
    }

    protected void Page_Load(object sender, EventArgs e)
    {

    }

    [WebMethod]
    public static void SetSession()
    {
        MinhaSessao = DateTime.Now.ToString();
    }

    [WebMethod]
    public static string GetSession()
    {
        return MinhaSessao;
    }
}

Pronto, simples não?

Caso precise passar vários parametros parar o método estático servidor, adicione um array no javascript e passe o array. No servidor recupere com string[]. Se alguém quiser, eu posso postar o código.

abraços,

Leave a Reply