AJAX en ASP.NET 2.0 con Web Services

10. January 2010 15:08 by Oscar.SS in Desarrollo Web  //  Tags:   //   Comments (2)

Para terminar con esta serie ( IIIIIIIV y ahora V) de las posibilidades que nos ofrece ASP.NET y AJAX, vamos a ver como realizar una llamada asíncrona al servidor a través de un servicio web.

Conceptualmente no se diferencia en nada de otras versiones de ASP.NET. Configurando convenientemente el servicio web podremos llamar a este desde un script de cliente y todo de forma asíncrona. Con ASP.NET 2.0, como siempre, nos ayudará en esta tarea el control ScriptManager.

 

 
 
 
Código Cliente
 
En primer lugar debemos registrar por medio del ScriptManager el servicio web y también como ya es costumbre el script donde se encuentra el código que realiza la llamada.
    <asp:ScriptManager ID="ScriptManager1" runat="server">
        
<Services>
            
<asp:ServiceReference Path="ServicioWeb.asmx" />
        </
Services>
        
<Scripts>
            
<asp:ScriptReference Path="funcionesWebService.js" />
        </
Scripts>
    
</asp:ScriptManager>

En el archivo funcionesWebService.js como ya hemos comentado se encuentra el código que envía los datos al servidor y también los recoge y manipula. A estas alturas este código, con tres funciones, una para enviar datos, otra para recogelos y la última en caso de error durante el proceso asíncrono, es de sobra conocido por todos.

//Funcion que llama al servicio web de forma asíncrona.
function EnviarDatos() {

    
//$get('') == document.getElementById('')
    
var nombreSeleccionado $get("listaNombres").value;

    
//Llamada al servicio web.
    
ServicioWeb.ObtenerDatos(nombreSeleccionado, RecogerRespuesta, RecogerErrores)
}


//Funcion que recoge los datos desde el servidor.
function RecogerRespuesta(datosRecibidos) {

    $
get("txRespuesta").innerText datosRecibidos;
}


//Función que recoge los posibles errores.
function RecogerErrores(error) {

    
alert("Error: " + error.get_message());
}

 

Código Servidor

En el archivo de código de nuestro servicio web debemos implementar el método que recibirá la petición del cliente y después de hacer las operaciones oportunas devolverá los datos al script de cliente.

[System.Web.Script.Services.ScriptService]
public class ServicioWeb : System.Web.Services.WebService 
{

    
public ServicioWeb () 
    {}


    [WebMethod]
    
public string ObtenerDatos(string nombreSelect) {

        
string ruta Server.MapPath("~/App_Data/datos.xml");

        
//Antes de enviar la petición simulamos una tarea larga.
        
System.Threading.Thread.Sleep(5000);

        return 
ManejarDatos.ObtenerCategoria(nombreSelect, ruta);
    
}
    
}

Como vemos hemos decorado la clase del servicio web con el atributo System.Web.Script.Services.ScriptService, de esta forma indicamos que la clase contiene servicios que serán utilizados mediante script de cliente. También hemos, al igual que con los Page Methods, decorado el método que recibe la llamada AJAX con el atributo System.Web.Services.WebMethod para indicar que se pretende exponer este métedo como parte del servicio web.

 

Código de descarga 

El código completo mencionado en este artículo se encuentra en la carpeta AJAX_NET_3.5/Retro_Llamadas/AJAX_WebService del siquiente enlace. Para probar la aplicación ejecutar la página Default.aspx de la carpeta mencionada.

 

AJAX_ASP.NET.rar (15,45 kb)

12 millones de euros...¡Quien parte y reparte, se lleva la mejor parte!

5. January 2010 12:53 by Oscar.SS in Personal  //  Tags:   //   Comments (4)

Al margen de la política o del gobierno de turno  (me da lo mismo si el que esta arriba tiene bigote, se parece a Mr. Bean o babea cuando habla) quiero hacer eco de la desfachatez de presentar un proyecto web como es la página oficial de la presidencia española europea por el módico precio de casi 12 millones de euros.

Como seguramente ya sabéis, estos días se ha publicado por toda la red el hackeo de la web de la presidencia. Algún listillo (con todos mis respetos) supuestamente subió una imagen de Mr. Bean a los servidores de la web.

 

 

 

En realidad, no han hackeado los servidores, no han accedido a ellos ni han subido ninguna imagen. Simplemente han inyectado algo de código (una query) en un campo de texto y han conseguido en el cliente del listillo (otra vez mis respetos) cargar esta imagen. Esta mejor explicado aquí. De todas formas es un error gravísimo y de ninguna manera aceptable en una solución profesional.

Aclarado este asunto. Veamos un poco en que se han invertido 12 millones de euros.

 

Contratación de dominios

Lo normal en este caso sería comprar todas las extensiones de dominos, o por lo menos las más importantes si andamos cortos de presupuesto como en este caso :-), para evitar que alguién pueda poner un contenido que nada tiene que ver con el nuestro con una URI que solo se diferencia en la extensión. Veamos unos ejemplos:

http://www.eu2010.com/

http://www.eu2010.org/

http://www.eu2010.info/

¡¡Y este es mi favorito!!, http://www.eu2010.eu/

 

Diseño de la página

Lo cierto es que yo (como casi todos los desarrolladores) no estoy dotado de mucha sensibilidad artística, es decir, que soy nulo para el diseño. Pero si se cuando me gusta algo, si se cuando una web tiene un diseño agradable, innovador o por lo menos decente.

Solo con entrar en la web y mirarla durante unos segundos basta para quedarse indiferente y decepcionado. Sinderamente, con este presupuesto me esperaba mucho más.

 

Escalabilidad

Durante toda la mañana la web funciona a paso de burro, esta practicamente "petada". Se conoce que por toda la publicidad que se le ha dado al supuesto hackeo, estamos todos entrando como borregos para encontrar fallos, o por simple curiosidad.

Cierto es que tener un buen rendimiento cuando se gestionan grandes volúmenes de visitas es un tema muy complejo, pero otra vez me esperaba más con este presupuesto. Supongo que con el tiempo lo solucionarán.

 

Funcionalidad, compatibilidad, calidad, pruebas, etc

Lo primero que llama la atención al entrar en la página es el calendario. Toda la página está en castellano pero no han traducido el calendario (en el momento de escribir este artículo esta en ingles). Cuando cambiamos de idioma, por ejemplo al Catalan, si está traducido. Pero lo encontramos en ingles otra vez al poner como idioma el Euskera.

En el menú horizontal nos encontramos tres cutres aes para cambiar el tamaño de la fuente en los contenidos. Si lo pruebas con Chrome funciona perfectamente, en IE 6.0 se descuadran todos los contenidos, en IE 8.0 al aumentar el contenido se sale de la pantalla y no se muestra el necesario scroll y en la última versión de FireFox ni siquiera funciona el JavaScript.

  

Es cierto que son fallos muy comunes y que nos encontramos en muchas web (incluidas en las que yo participo) pero ninguna de ellas con un presupuesto de 12 millonazos de euros. ¡Que verguenza!.

En el pie de página tenemos varios enlaces, condiciones generalespolitica privacidadaviso seguridad, y accesibilidad  que o no funcionan correctamente (sobre pasa el tiempo de espera de la respuesta del servidor) o simplemente no carga el contenido que pretenden tener, ¿se le habrá olvidado a álguien?.

Al parecer la página esta desarrollada sobre un OpenCMS en Java ;-), lo que podría justificar un poco la falta de elasticidad a la hora de implementar ciertas funcionalidades pero en ningún caso los errores mencionados. Aquí tenéis una web muchísimo, pero muchísimo, más barata y mejor implementada con otro OpenCMS en la que han participado tan sólo un programador, un analista y un jefe de proyecto. ¿Por qué se esto?, porque han sido mis compañeros los que la han desarrollado.

 

Las Cifras y los implicados 

Para ser del todo sinceros y veraces, algunos medios en la web defienden que el desarrollo en sí del proyecto no ha costado 12 millones, es decir, que solo una parte (excesiva parte de todos modos) se ha destinado al desarrollo. Pero la adjudicación oficial del contrato público no parece indicar lo anterior. Aún así, con las cifras que se manejan, por ejemplo, 147.900 euros de traducción665.778 euros en asistencia técnica de redacción y documentación, etc...son como para desconfiar.

Vamos que desde arriba hacia abajo, Gobierno, Telefónica, Informática el Corte Ingles y todos los intermedirarios...¡a saber que ha pasado para manejar estas cifras!.

Desde luego, quiero dejar claro que nadie critica el trabajo del equipo de desarrollo de esta web. Al contrario, los errores comentados, por desgracia, son de lo más habitual en el mundo del desarrollo web.

A saber en que condiciones han trabajado esta pobre gente. Con presiones, con plazos mal previstos, con escasos recursos...¡vete tu a saber!. Pero tengo claro que seguramente no ha sido nada agradable para ellos este proyecto. Además desde que salto la alarma en los medios del supuesto hackeo me los imagino a los pobres trabajando hasta las 12 de la noche sin comer y con miedo de que rueden cabezas. 

 

Resumiendo

Que independientemente del presupuesto del proyecto me esperaba mucho más de una web que nos representa a todos los españoles ante europa (y el mundo). Y que sin miedo ha equivocarme, el presupuesto esta sobre estimado muy por encima...¡¡ezto pati y ezto pami que pa ezo semos españoles!!.

Como siempre dice con pesar y desánimo un buen compañero mio...¡que país! ;-)

Acceder a las propiedades y controles de una MasterPage (II)

28. December 2009 15:04 by Oscar.SS in Desarrollo Web  //  Tags:   //   Comments (0)

La forma recomendada por MSDN de acceder a las propiedades de una MasterPage es utilizando la directiva @MasterType. Al colocar esta directiva en nuestra página de contenido, obtenemos una referencia con establecimiento inflexible de tipos a nuestra MasterType.

<%@ MasterType VirtualPath="~/MasterPage.master" %> 

Esta directiva tiene dos posibles atributos que son mutuamente excluyentes, VitualPath y TypeName. Es decir, solo podemos utilizar uno de ellos al mismo tiempo. En el ejemplo anterior hacemos referencia a la MasterPage por medio de la ruta vitual. Pero también podríamos hacerlo con idénticos resultados por medio del atributo TypeName y especificando el nombre de la clase de nuestra MasterPage.

De esta forma ya estará a nuestra disposición la referencia a la MasterPage por medio de la propiedad Master de la página de contenido, como vimos en el ejemplo anterior. Por lo tanto podremos acceder a sus propiedades directamente o a sus controles por medio del método FinControl().

Otra forma de tener acceso a los controles de la MasterPage es creando una propiedad del tipo del control. Por ejemplo, para un control Label:

    public string TextoLabel
    {
        
get 
        
{
            
return Label1.Text;
        
}
        
set
        
{
            Label1.Text 
= value;
        
}
    }

    
public Label ControlLabel
    {
        
get 
        
{
            
return Label1;
        
}
        
set
        
{
            Label1 
= value;
        
}
    }

Como vemos podemos crear una propiedad haciendo referencia una propiedad concreta del control (en este caso Label1.Text) o directamente una propiedad del tipo de control para tener acceso a todas sus propiedades y métodos.

 

Relacionado con este artículo: 

Acceder a las propiedades y controles de una MasterPage (I) 

Acceder a las propiedades y controles de una ContentPage desde una MasterPage

Acceder a las propiedades y controles de una ContentPage desde una MasterPage

21. December 2009 23:03 by Oscar.SS in Desarrollo Web  //  Tags:   //   Comments (0)

Este caso se podría decir que es lo contrario de Acceder a las propiedades y controles de una MasterPage. Ahora queremos acceder a las propiedades y controles que tengamos declarados en nuestra página de contenido o Content Page (también content), desde la master que la contiene.

 

Acceso a los controles

En el código de la master, utilizando el método FindControl() del control de servidor ContentPlaceHolder encontraremos los controles a los que queremos tener acceso. No olvidemos que el control ContentPlaceHolder es el contenedor que contiene nuestra página de contenido.

 

            Label2.Text ((TextBox)ContentPlaceHolder1.FindControl("TextBox1")).Text;

 

Acceso a las propiedades

Para acceder a las propiedades de la página de contendido deberemos "kurrarnoslo" un poco más. En primer lugar declararemos una interfaz que implemente las firmas de las propiedades a las que queremos tener acceso. Por ejemplo:

            public interface miInterfaz
            {
                
string miPropiedad { get; set; }
            }

Esta interfaz deberá ser implementada por nuestra Content Page y por consiguiente también las propiedades que contenga la interfaz. Hecho esto, podremos acceder desde la Master Page a la propiedades implementadas en la content con un código como este:

 

        var miContent (miInterfaz)this.Page;

        if 
(miContent != null)
            Label1.Text 
miContent.miPropiedad;

 

Nota: Parte de este artículo ha sido escrito gracias a unos buenos compañeros de los foros.

 

Relacionado con este artículo: 

Acceder a las propiedades y controles de una MasterPage (I) 

Acceder a las propiedades y controles de una MasterPage (II)

 

Acceder a las propiedades y controles de una MasterPage (I)

21. December 2009 21:33 by Oscar.SS in Desarrollo Web  //  Tags:   //   Comments (0)

Supongamos que tenemos una página principal o Master Page llamada miMasterPage. Esta master contendrá una propiedad pública implementada por nosotros y un control de tipo TextBox.

Para mayor claridad, de ahora en adelante, nos referiremos a las páginas que contiene una Master Page como Content Page. Ahora queremos acceder desde el Code Behind de una de las páginas content a las propiedades públicas y a los controles que contiene la master.

Lo primero que tenemos que hacer es instanciar un objeto de tipo miMasterPage por medio de la propiedad Master que contiene todas las páginas content.

        var miMaster (miMasterPage)this.Master;

De esta forma el objeto miMaster representa una instancia de nuestra Master Page y por lo tanto tendremos acceso directo a todas sus propiedades públicas y controles.

        Label1.Text miMaster.miPropiedad;
        
Label2.Text ((TextBox)miMaster.FindControl("TextBox1")).Text;

Para acceder a los controles deberemos utilizar el método FindControl(). Pero como vemos, una vez creada la instancia de nuestra Master Page la forma de acceder a las propiedades y controles es muy natural.

 

Relacionado con este artículo: 

Acceder a las propiedades y controles de una MasterPage (II) 

Acceder a las propiedades y controles de una ContentPage desde una MasterPage

Recent Comments

Comment RSS

Month List