martes, 8 de enero de 2008

XSLT-XML y AJAXPRO


Cuando estemos trabajando con XSLT y AjaxPro, aunque podríamos decir que es igual que Ajax, presenta un número mayor de posibilidades en cuanto a métodos y procedimientos que esta dll nos ofrece, adicionalmente, en el caso de que estemos devolviendo esquemas de estructuras de clases u objetos como dataset tipados o datatables, nos exige que estos se encuentren serializados, definiendo una transmisión de datos más segura.

En este artículo veremos como la misma funcionalidad definida en el artículo de XSLT-XML y Ajax se comporta en AjaxPro, lo bueno de todo, es que el mismo código que definimos en el servidor, nos sirve, a excepción de la dll de Ajax, ya que utilizaremos la de AjaxPro.dll.

Ahora si desean tener un detalle de XSLT y XML, pueden ir al articulo XSLT-XML y AJAX, en donde defino un resumen de lo que es XSLT y pongo a dispocición url's de ayuda, para los principiantes.
NOTA. Se debe considerar que en este ejercicio se está utilizando un archivo XSLT el cual se define en el artículo XSLT-XML y AJAX, si han ido paso a paso, no les faltará este archivo en la solución.

Ejemplo

En el siguiente ejercicio veremos como, la funcionalidad definida en Ajax, funciona en AjaxPro, con la salvedad de que en el servidor y en el cliente AjaxPro nos ofrece la posibilidad de un número mayor de propiedades y métodos, que no se encuentran en la dll de Ajax que he utilizado para los ejemplos planteados. Adicionalmente se debe hablar de la serialización que se puede utilizar en la transmición de datos entre el cliente y el servidor, que la dll de Ajax utilizada no contempla.

No se si microsoft a mejorado la dll de Ajax para desarrolladores en este aspecto, creo que en los controles si, pero que pasa con los que nos gusta picar código???.

Ahora nos falta ver como se comporta esto en AjaxPro, lo bueno de todo, es que el mismo código que definimos en el servidor, nos sirve, a excepción de la dll de Ajax, ya que utilizaremos la de AjaxPro.dll.

En el cliente tendremos que hacer algunos cambios, que en realidad serán muy pocos, pero que permitirán ver las diferencias de despliegue que se tornan ineteresantes y, que la versión de la dll de Ajax que estoy utilizando no considera.

Antes de continuar con el ejercicio me gustaría destacar que la plantilla xsl que hemos definido ya puede ser modificada para mostrar la información de otra forma, lo cual demuestra que sin modificar el código que genera y entrega el archivo xml podemos modificar la forma de desplegar la información, lo cual nos permite definir muchas plantillas xsl para el manejo de la misma información.

En el caso de este ejercicio, seguiremos utilizando la misma plantilla que ya definimos para el despliegue con Ajax, pero deberemos considerar y seguir los siguientes pasos:

Copiaremos en el directorio bin del proyecto la dll AjaxPro.dll. De más esta decir que al copiar una dll en este directorio, automáticamente queda definido como una referencia, si no me creen realicen el ejercicio y luego vean el propiedades del proyecto las referencias que se han agregado.
El siguiente paso será crear un nuevo archivo aspx, el cual llamaremos AjaxProXslt.aspx, luego iremos al archivo web.config y agregaremos la siguiente línea de código en el nodo httpHandlers, como se muestra a continuación.

<add verb="POST,GET" path="ajaxpro/*.ashx"
type="AjaxPro.AjaxHandlerFactory, AjaxPro"/>

Si se observa, la única diferencia entre la línea de referencia de Ajax y AjaxPro está dada en la llamada de la dll a Ajax o a AjaxPro y la llamada al HandlerFactory.

En el ejercicio que publicaremos estoy dejando las dos líneas para que tengan el punto de comparación, así como las dos dll’s y los dos archivos que consumen el mismo archivo xsl. Ahora, en el método que atiende el evento load de la página que hemos creado agregaremos la siguiente línea de código:

protected void Page_Load(object sender, EventArgs e){
AjaxPro.Utility.RegisterTypeForAjax(typeof(AjaxProXslt));
}

Al momento de definir la línea de registro de tipo de nombre de clase, se puede observar que el Inteliggence despliega muchos más métodos y propiedades que el de la dll de Ajax. Con esto se puede observar, que esta dll está más orientada al desarrollo que la de Ajax, ya que Microsoft se ha centrado mucho más en la utilización de controles y ha dejado de lado la definición de funciones y procedimientos que el usuario pueda tener a medida en sus organizaciones, ya que si bien, existe un espectro muy grande de controles, no pueden existir controles para todos los requisitos de todas las organizaciones, por esto, es necesario conocer y saber Ajax y/o AjaxPro, lo cual permitirá construir controles propios. Bajo esta perspectiva es que nuevamente recalco que es muy importante el conocer y manejar de forma avanzada JavaScript.

El siguiente paso será crear el método que será solicitado desde el cliente, en realidad, el método será el mismo que creamos en el ejercicio anterior con Ajax, pero la diferencia estará en la forma de definir el método, ya que en esta ocasión lo firmaremos con la declaración de AjaxPro, pondremos el código completo para ver como queda:

[AjaxPro.AjaxMethod()]
public String getEmpleado()
{
String strResultado = "";
try
{
XmlDocument xml = new XmlDocument();

System.Text.StringBuilder strTxt = new System.Text.StringBuilder();

strTxt.Append("<root>");
strTxt.Append("<parametro>");
strTxt.Append("<opcion>1</opcion>");
strTxt.Append("</parametro>");
strTxt.Append("</root>");

xml.LoadXml(strTxt.ToString());
String strCnx = "Data Source=(local);Initial Catalog=Northwind;Integrated Security=True";

String strSql = "select 1 as tag, null as parent, " +
"EmployeeID as [empleado!1!id!element], LastName as" +
" [empleado!1!apellido!element] from Employees " +
"for xml explicit";

SqlConnection cnx = new SqlConnection(strCnx);
cnx.Open();
SqlCommand cmd = new SqlCommand(strSql, cnx);
SqlDataReader rdr = cmd.ExecuteReader();

String strDato = "";
While (rdr.Read())
{
strDato = rdr[0].ToString();
}

xml.LastChild.InnerXml = xml.LastChild.InnerXml + strDato;

System.IO.StringWriter swHtml = new System.IO.StringWriter();
System.Xml.Xsl.XslCompiledTransform xsl = new System.Xml.Xsl.XslCompiledTransform();

xsl.Load(HttpContext.Current.Server.MapPath("~") + "\\despliegue.xsl");

xsl.Transform(xml, null, swHtml);
strResultado = swHtml.ToString();

swHtml.Close();
cnx.Close();
}
catch (Exception ex)
{
throw ex;
}
return strResultado;
}

No debemos de olvidar de realizar la importación de los espacios de nombre que utilizamos para crear los controles de conexión a Base de Datos o como los de creación de xml. Si no se acuerdan, aquí se los escribo nuevamente.

using System.Data;
using System.Data.SqlClient;
using System.Xml;

El ultimo paso es definir la llamada desde el cliente, para ello crearemos las líneas de código en JavaScript, pero antes definiremos el cuerpo del HTML, con las siguientes líneas.

<body>
<form id="frm" runat="server">
<div id="divSeleccion">

</div>
</form>
</body>

Ahora definiremos las funciones en JavaScript que permitirán conectarnos al AjaxPro Method, o método de de AjaxPro.

<script language="javascript">
function getEmpleado(){
AjaxProXslt.getEmpleado(getEmpleado_callback,
document.getElementById("divSeleccion"));
}

function getEmpleado_callback(res) {
if (res.error!=null){
alert(res.error.Message);
}else{
res.context.innerHTML = res.value;
}
}

</script>

Como se observa, la forma de realizar la llamada y la carga es muy similar a la definida en Ajax, pero se observa que el manejo de errores está más trabajado, ya que en este existe un método Message, que solo retorna el texto del mensaje de error. Esto nos permite personalizar los mensajes que se envían a los usuarios que operan en la página.

Por ultimo, nos falta realizar la llamada inicial, para ello, en el body agregaremos en la sentencia onload, la misma llamada que definimos en la ejercicio anterior, es decir:

<body onload="javascript:getEmpleado();">


Resumen

Con XSLT y AjaxPro, aunque a primera instancia podríamos decir que es igual que Ajax, presenta un número mayor de posibilidades en cuanto a propiedades, métodos y procedimientos que esta dll nos ofrece. Adicionalmente, en el caso de que estemos devolviendo esquemas de estructuras de clases u objetos como dataset tipados o datatables, nos exige que estos se encuentren serializados, definiendo una transmisión de datos más segura.

volver

No hay comentarios: