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

AJAX en ASP.NET 2.0 con Page Methods

12. December 2009 11:56 by Oscar.SS in Desarrollo Web  //  Tags:   //   Comments (0)

En el artículo anterior de esta serie vimos la potencia y facilitdad que nos ofrece un control UpdatePanel combinado con un ScriptManager. Pero no es oro todo lo que reluce. ¿Que sucede si tenemos una página con muchos controles pero solo queremos actualizar por AJAX uno de ellos?.

Tenemos que tener en cuenta que cuando utilizamos un UpdatePanel estamos enviando al servidor todo el HTML de la página. Es decir, no solo estamos enviando el contenido del UpdatePanel, enviamos también todos los controles que encuentran fuera. Y esto aumenta mucho el tráfico hacia el servidor. Además, en el servidor se disparan todos los eventos del ciclo de vida de la página y de todos los controles que contenga. Lo que recarga las funciones realizadas por el servidor.

Eso si, el servidor gracias al UpdatePanel y a las librerías cliente que nos ofrece el ScriptManager, solo envía el HTML necesario para actualizar los controles que se encuentren dentro del UpdatePanel.

Estas consideraciones debemos tenerlas en cuenta si estamos implementado AJAX en una página muy pesada con mucho controles. La implementación de los métodos de página o Page Methods nos ofrece la posibilidad de tener más control sobre la forma de actualizar la página a cambio de perder un poco de automatización.

 

 

 

Código Cliente

Lo primero que tenemos que hacer es habilitar la funcionalidad de los métodos de página en el control ScriptManager por medio de la propiedad EnablePageMethods.

    <asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true">
        
<Scripts>
            
<asp:ScriptReference Path="funcionesPageMethods.js" />
        </
Scripts>
    
</asp:ScriptManager> 

Por otro lado, hemos añadido una referencia al archivo JavaScript que contendrá las funciones necesarias para el envío y recogida de datos de forma asíncrona. Este es el código.

//Funcion que llama al método de la página de forma asíncrona.
function EnviarDatos() {

    
//$get('') == document.getElementById('')
    
var nombreSeleccionado $get("listaNombres").value;
    
    
//Llamada al metodo de la página.
    
PageMethods.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());
}

Ya estamos acostumbrados a este tipo de implementación, una función para enviar los datos asíncronos, otra para recogerlos y una función para recoger los errores que se produzcan durante la llamada. Lo único que merece la pena resaltar es esta linea.

 PageMethods.ObtenerDatos(nombreSeleccionado, RecogerRespuesta, RecogerErrores);

 

La clase PageMethods intrínseca de la librería ASP.NET AJAX nos permite llamar a la función ObetenerDatos() que es un método estático que se encuentra en nuestra página.

 

Código Servidor

En el código de servidor solo tendremos que implementar el método que se encarga de recoger los datos desde el cliente y enviarlos asíncronamente una vez manipulados de vuelta al cliente. 

    [System.Web.Services.WebMethod]
    
public static string ObtenerDatos(string nombreSelec)
    {
        
//Antes de enviar la petición simulamos una tarea larga.
        
System.Threading.Thread.Sleep(5000);
        
        return 
ManejarDatos.ObtenerCategoria(nombreSelec, rutaDatos);
    
}

Como vemos este método tiene que ser static y estar decorado con el atributo System.Web.Services.WebMethod.

 

Código de descarga 

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

 

AJAX_ASP.NET.rar (15,45 kb)

Enviar datos asíncronos a un control fuera de un UpdatePanel

8. December 2009 17:48 by Oscar.SS in Desarrollo Web  //  Tags:   //   Comments (6)

Es posible que a muchos este título les suene a chino, y quizás también, no sea un caso que se de muy a menudo. Pero opino que es una característica que debemos conocer para tener más control sobre las aplicaciones ASP.NET AJAX.

 

El problema

Comenzemos plantenado el problema. Cuando utilizamos AJAX Extensions en una aplicación ASP.NET sabemos que en la respuesta asíncrona del servidor solo se envía de vuelta al cliente web una porción muy pequeña de HTML. Exactamente, solo se envía el HTML necesario para actualizar los controles que se encuentran dentro de un UpdatePanel, es lo que se conoce como repintado parcial. ¿Pero que ocurre si queremos, en algunas ocasiones, actualizar un control que se encuentra fuera de un UpdatePanel?. Es decir, ¿como podemos decirle al servidor que envíe otros datos además del HTML del repintado parcial?.

Veámoslo con un pequeño ejemplo.

    <div>
        
<asp:TextBox ID="TextBox1" runat="server">
            
</asp:TextBox><asp:Button ID="Button1" runat="server" Text="Button" 
            onclick
="Button1_Click" />
        <
br />
        <
br />
    
<!-----------Sección que se actualiza por AJAX (repintado parcial)--------------->
        
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
            
<ContentTemplate>
                
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
            
</ContentTemplate>
            
<Triggers><asp:AsyncPostBackTrigger ControlID="Button1" EventName="Click" /></Triggers>
        
</asp:UpdatePanel>
    
<!-------------------------------------------------------------------------------->    
        
<br />
        <
br />
        <
asp:Label ID="Label2" runat="server" Text="Label"></asp:Label>
    
</div>

 

¿Que tenemos aquí?. Tenemos un TextBox donde el usuario introducirá su nombre y tenemos dos Labels que mostrarán un saludo al usuario cuando hagan Click sobre el Button. Como podemos observar uno de los Labels se encuentra dentro de un UpdatePanel y el otro fuera. El que esta dentro se aprovechará de la funcionalidad de AJAX para actualizar su contendido de manera asíncrona.

Añadamos código para manejar el evento del Button y veamos que sucede.

 

        protected void Button1_Click(object sender, EventArgs e)
        {
            
string datosEnviados "Hola " + TextBox1.Text;

            
Label1.Text datosEnviados;
            
Label2.Text datosEnviados;
        
}

 

Al ejecutarse el evento vemos que solo se actualiza el Label1. El Label2 no se entera de nada. ¿Porque?.

Ya lo hemos comentado ante. El servidor solo está enviando al cliente el HTML necesario para actualizar los controles que se encuentran dentro del UpdatePanel.Repito la pregunta, ¿como podemos decirle al servidor que envíe otros datos además del HTML del repintado parcial?.

 

La solución

Cambiamos el código del evento del Button por el siguiente:

            string datosEnviados "Hola " + TextBox1.Text;
            
Label1.Text datosEnviados;

            
ScriptManager1.RegisterDataItem(Label2, datosEnviados);

El método RegisterDataItem() del ScriptManager envía datos en una llamanda asíncrona a los controles que se encuentran fuera del UpdatePanel. Ahora debemos manegar el siguiente evento en el cliente.

    <script type="text/javascript" language="javascript">
        Sys.WebForms.PageRequestManager.getInstance().add_pageLoading(RecogerDatosHandler)
;

        function 
RecogerDatosHandler(sender, args) {
            
var datos args.get_dataItems();
            
$get("Label2").innerHTML datos["Label2"];
        
}
    </script>

En primer lugar obtenemos una instancia de la clase Sys.WebFroms.PageRequestManager que es la encargada de actualizar los controles que se encuentran dentro del UpdatePanel. Antes de que esta actualización ocurra, gestionamos el evento pageLoading() y recogemos los datos enviados desde el servidor para actualizar el Label2.

Hemos creado nuestro propio manejador del evento, RecogerDatosHandler(), que por medio del la colección args podemos acceder a los datos enviados desde el servidor.

Nota: La definición del script cliente anterior debe colocarse después de la definición del controls ScriptManager, de lo contrario nos dará un error diciendo que el espacio de nombres Sys no está definico aún, ¡como es lógico!.

 

Recent Comments

Comment RSS

Month List