Archivos mensuales: Julio 2008

Claro que Uds. se preguntan que corcho tiene que ver una libreria de JS contra un lenguaje server side? Bueno, hay un motivo :) EN realidad esto apunta hacia el uso de los metodos AJAX de la JQuery.

Como algunos saben, ASP.NET es un motor montado “sobre” el framework de .NET. Como motor, tiene muchas cosas (manejo de sesiones, Requests, themes,  skins, autenticacion, etc etc) que en realidad se ejecutan cada vez que ejecutamos una pagina ASPX. 

Entonces, supongamos que nosotros queremos hacer un metodo que nos devuelva un objeto JSON 

{"name":"Pepe","surname":"Gomez","message":"Hi world"}

Para hacer eso, tranquilamente podriamos hacer una pagina .ASPX que tuviera el Response.Write que necesitamos, no hay nada malo en hacer eso. Y despues con la JQuery tomarlo. Pero que pasa? Usando un ASPX estamos probablemente usando modulos que no necesitamos para algo tan sencillo como ir al server y volver.

Para eso, se recomienda usar los User Handled Modules (.ashx). Estos archivos no tienen toda la bocha de modulos que se cargan por default en los ASPx, y sin embargo, se puede usar todo el framework como si fuera una clase en C#/VB.net. La parte “mala” es que, al no tener “dos capas” como tiene ASP.NET (una capa de presentacion y la capa de code-behind), tenemos que “escupir” el HTML o los objetos usando Response.Write.

using System;
using System.Web;
using System.Web.SessionState;

public class Handler : IHttpHandler , IReadOnlySessionState{

    public void ProcessRequest (HttpContext context) {
        context.Response.ContentType = "text/html";
        context.Response.Write("Hello World");
    }

    public bool IsReusable {
        get {
            return false;
        }
    }

}

Entonces nuestro codigo quedaria algo asi:

Pagina Nombre.aspx

<script>
function actualizar() {
 $.getJSON("miHandler.ashx",
        function(data){
          $("#prueba").html ( data.name + " - " + data.message);
       });
}
</script>
<input onclick="actualizar()" type="button" value="Voy a ejecutar eso" />

Handler miHandler.ashx

using System;
using System.Web;
using System.Web.SessionState;

public class Handler : IHttpHandler , IReadOnlySessionState{

    public void ProcessRequest (HttpContext context) {
        context.Response.ContentType = "text/plain";
        context.Response.Write(" {\"name\":\"Pepe\",\"surname\":\"Gomez\",\"message\":\"Hi world\"} ");
    }

    public bool IsReusable {
        get {
            return false;
        }
    }

}

Si necesitan (por algun motivo) acceder a la sesion dentro del Generic Handler, no se olviden de implementar la interface IReadOnlySessionState, de otra forma, el objecto context.Session es null. Si necesitan acceso de lectura y escritura, deberian implementar IRequiresSessionState .

Y para acceder al Request (para recuperar parámetros por ej) pueden usar context.Request

Mas informacion