martes, 14 de diciembre de 2010

Manipular objetos personalizados del lado del servidor desde Javascript

aspnet_to_javascript Estarás de acuerdo conmigo con que utilizar AJAX para recuperar un número o una cadena de texto es una tarea muy sencilla y casi cotidiana.
La pregunta es: Alguna vez has recuperado desde javascript un objeto personalizado creado en el servidor? o mejor aún, has recuperado desde javascript una colección de esos objetos personalizados?
Antes de ver cómo es que sugiero que se haga, ponte un momento a pensar cómo lo harías, luego de eso comparemos las soluciones, si consideras que la tuya es mejor, te invito a que la compartas.
Empezaré con el ejemplo.

1. Añado un proyecto VB.NET de tipo ASP.NET versión 3.5 y lo llamaré CustomObjectsToJavascript. Chequee que esté incluída la referencia a ASP.NET AJAX (System.Web.Extensions).

2. Añado una clase personalizada llamada ServerObject y tipeo el siguiente código:
Public Class ServerObject

Public Property FullName() As String
Public Property Position() As String
Public Property Age() As Integer

Public Sub New(ByVal fullname As String, ByVal position As String, ByVal age As Integer)
_FullName = fullname
_Position = position
_age = age
End Sub

End Class


3. Añado un web service llamado WebService1.asmx, y añado el sgte código:

Imports System.Web.Services
Imports System.Collections.Generic

<System.Web.Script.Services.ScriptService()> _
<System.Web.Services.WebService(Namespace:="http://tempuri.org/")> _
Public Class WebService1
Inherits System.Web.Services.WebService

<WebMethod()> _
Public Function MyServerObjects() As List(Of ServerObject)
Dim so As New List(Of ServerObject)

so.Add(New ServerObject("Juan Cotrina", "Consultor Financiero", 31))
so.Add(New ServerObject("Johnny Serrano", "Soporte de Sistemas", 32))
so.Add(New ServerObject("Herky Mezarina", "Arquitecto de Software", 33))
so.Add(New ServerObject("Ysrael Mertz", "Webmaster", 34))
so.Add(New ServerObject("Steve Chunga", "Desarrollador de software", 35))

Return so

End Function

End Class


Como observan, el web service devolverá una colección de objetos personalizados. Y es esta colección de objetos personalizados la que recuperará javascript.

4. Añado una página aspx e inserto el sgte código:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Recuperar objetos personalizados desde javascript</title>
<script type="text/javascript">
function getServerObjects() 
{
CustomObjectsToJavascript.WebService1.MyServerObjects(WhenServerObjectsSuccess, WhenServerObjectsFailure);
}

function WhenServerObjectsSuccess(result, context, methodName) 
{
var Objects = new Sys.StringBuilder();
for (var i = 0; i < result.length; i++) 
{
var ServerObject = result[i];
Objects.append("Mi nombre es " + ServerObject.FullName + " y mi especialidad es " + ServerObject.Position + "<br />");
}
$get("div1").innerHTML = Objects.toString();
}

function WhenServerObjectsFailure(error, context, methodName) 
{
$get("div1").innerHTML = error.get_message();
}    
</script>
</head>
<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server">
<Services>
<asp:ServiceReference Path="~/WebService1.asmx" InlineScript="true" />
</Services>
</asp:ScriptManager>
<div>
<a href="javascript:;" onclick="getServerObjects()">Recuperar Objetos Personalizados desde el servidor</a>
<div id="div1" />
</div>
</form>
</body>
</html>


Como ven, era muy simple. La carnecita está en estas líneas:

<asp:ServiceReference Path="~/WebService1.asmx" InlineScript="true" />

la cual hace la referencia al web service.

CustomObjectsToJavascript.WebService1.MyServerObjects(WhenServerObjectsSuccess, WhenServerObjectsFailure);


la cual apunta a Namespace.web_service.método_del_web_service(…)

Ya para ir terminando le diré que por más que se trate de un objeto personalizado, para javascript esto no representa un problema, porque los servicios web ASP.NET para hacer la comunicación cliente servidor envían la colección de objetos con el formato JSON, el cual tiene natural entendimiento con javascript, y javascript puede manipular esa colección como si de un simple array se tratara.

Espero que les sea de utilidad ;)

No hay comentarios.: