El Blog de Óscar Sotorrío Sánchez - MCP Application Development Foundation - C#

Todo lo que vaya aprendiendo de .NET, C#, ASP.NET, SQL Server, etc, lo compartiré con vosotros.

El autor:

Óscar Sotorrío Sánchez
Contacto Send mail

Encuéntralo

Álguien dijo...


Nada tan estúpido como vencer; el verdadero triunfo esta en convencer.

Victor Hugo

La intención no es lo que cuenta

Precisamente esto es lo que le ocurre al libro que os presento hoy. Es un libro con muy buena intención, muy completo, relativamente breve en su contenido y bien organizado. Pero lamentablemente han fallado en la traducción.

 

 

ASP.NET 3.5

Título: ASP.NET 3.5
Autor:George Shepherd
Editorial:Anaya Multimedia
I.S.B.N.: 978-84-415-2439-2
Fecha publicación: 2008.
Nº páginas: 688.
Nº capítulos: 24.
Precio: 58.60 euros.

  

Elogios:

Prácticamente ya lo he comentado antes. Los capítulos del libro están muy bien organizados y su contenido es muy completo. Comienza por lo conceptos básicos de toda aplicación web para continuar con los conceptos básicos de las aplicaciones web ASP.NET.

A continuación, dedica algunos capítulos a los controles web y a los Web Parts. Configuración de aplicaciones ASP.NET y seguridad en el inicio se sesión. Enlace a datos, personalización, estado de sesión y caché. Depuración y trazas, manejadores ashx, servicios web y WCF, AJAX, WPF y para finalizar publicación de sitios ASP.NET.

Como podéis ver, el libro contiene prácticamente todo lo que hay que saber para construir sitios consistentes con ASP.NET.

 

Críticas:

La nefasta traducción hace muy difícil la comprensión de los conceptos más duros. Por no hablar, del aburrimiento y desmotivación que supone leer frases que más se parecen al habla de "los indios" en los westerns americanos. Realmente han fallado con la versión española de esta publicación. 

Mencionar también, lo que ocurre siempre con este tipo de libros, al intentar abarcar tanto, hay capítulos que quedan muy cortos y tienes que buscar una segunda lectura para profundizar. Especialmente esto me ha disgustado en el capítulo dedicado a AJAX.

 

Resumiendo:

Hace algunos días, me escribía un lector de este blog pidiéndome consejo sobre un libro de C#. Su caso es el de una persona que está empezando en esto de la programación y se había comprando un libro de la misma editorial, concretamente "Visual C# 2008", y literalmente me comentaba que el libro era para tirarlo porque la tradución era horrible. Curiosamente, ambos libros son de la misma colección de Anaya Multimedia, "Paso a paso".

En fin, que si el idioma no es un problema para vosotros os recomiendo que lo compréis en ingles porque el libro tiene muy buena intención pero en este caso no fué suficiente.


Categories: Formación
Posted by Oscar.SS on jueves, 17 de junio de 2010 22:03
Permalink | Comentarios (0) | Post RSSRSS comment feed

Ajedrez aleatorio de Fischer en ASP.NET

Supongo que esto es una frikada de las buenas pero...¡que leches!...me ha apetecido hacerlo. Además, me consta que muchos compañeros de profesión son también aficionados al ajedrez.

Por lo tanto, me he currado una pequeña aplicación que genera posiciones iniciales aleatorias de ajedrez siguiendo las reglas del conocido como Fischer Random Chess o FRC, y también Fischer 960. Aquí podéis ver una de esas posiciones.

 

 

En el generador de posiciones podéis encontrar una breve explicación, así como enlaces relacionados, sobre esta interesante modalidad de ajedrez.

 

También, si lo queréis, podéis obtener el código fuente de la aplicación escribiéndome en la zona de contacto. No es el mejor ejemplo de código del mundo pero no está mal para haberlo hecho en una tarde y...¡de vacaciones tomándome unas birras en la terraza!.

Solo os pido 3 cosillas a cambio:

  • Vuestro nombre, para dirigirme a vosotros.
  • El país y región.
  • Una breve explicación contándome para que queréis la aplicación.
 
 
Podéis reescribir el código, podéis publicarlo donde queráis, podéis utilizarlo cómo y dónde queráis. ¡¡Es totalmente FREE!!
 
 

 


Tags:
Categories: Desarrollo Web
Posted by Oscar.SS on viernes, 11 de junio de 2010 18:31
Permalink | Comentarios (0) | Post RSSRSS comment feed

Enviar datos entre páginas ASP.NET

Existen distintas formas de enviar información o datos entre páginas y cada una tiene sus ventajas e inconvenientes. Por lo tanto, debemos evaluar estas consideraciones para determinar como implementar esta funcional en cada caso concreto.

En este artículo vamos a a hablar de un método que estaba disponible en las páginas ASP de antaño y que dejó de estarlo en las versiones ASP.NET 1.x. Con la llegada de ASP.NET 2.0 Microsoft puso a nuestra disposición otra vez la técnica bautizada como Cross Page PostBack (¡telita con el nombre!).

La técnica consiste en hacer que un formulario no se envíe sobre si mismo, es decir, que haga un Submit sobre otra página. Esto se consigue por medio de la propiedad PostBackUrl que implementan los siguientes controles.

        <asp:Button ID="Button1" runat="server" Text="Button" PostBackUrl="~/PaginaDestino.aspx" />
        <asp:ImageButton ID="ImageButton1" ImageUrl="~/img/enviar.png" runat="server" PostBackUrl="~/PaginaDestino.aspx" />
        <asp:LinkButton ID="LinkButton1" runat="server" PostBackUrl="~/PaginaDestino.aspx">LinkButton</asp:LinkButton>

Estos controles estarán insertados en nuestra página de origen y como vemos la propiedad PostBackUrl apuntará a la página de destino sobre la que se quiere enviar los datos de la página actual.

Suponiendo que en la página de origen tenemos un campo de texto sobre el que el usuario escribe un texto que será enviado a la página de destino, en el código de esta, obtendremos el valor del campo de texto y lo mostraremos de la siguiente forma.

            if (PreviousPage != null)
            {
                TextBox ControlEncontrado 
(TextBox)PreviousPage.FindControl("TextBox1");

                if 
(ControlEncontrado != null)
                {
                    sptexto.InnerText 
ControlEncontrado.Text;
                
}
            }

La propiedad PreviousPage de la página de destino nos devuelve una referencia a la página de origen y mediante su método FindControl() buscaremos el control sobre el que escribió el usuario.

Es muy importante, como hemos visto, hacer las comprobaciones oportunas sobre la propiedad PreviousPage y el método FindControl() para evitar sorpresas del tipo System.NullReferenceException.

Existe otra forma de utilizar esta técnica que es recomendable si tenemos pensado diseñar la página de origen exclusivamente para compartir información con otras páginas. Consiste en exponer los datos que se quieren compartir o enviar como propiedades públicas. Es decir, en la página de origen haremos algo como esto:

 

        public string NombrePropiedadTexto
        {
            
get 
            
{
                
return TextBox1.Text;
            
}
        }

        
public TextBox NombrePropiedadControl
        {
            
get
            
{
                
return TextBox1;
            
}
        }

En primer lugar, en la página de destino deberemos escribir la directiva PreviousPageType apuntando a la página de origen

<%@ PreviousPageType VirtualPath="~/PaginaOrigen.aspx" %> 

O también así.

<%@ PreviousPageType TypeName="EspacioDeNombres.PaginaOrigen" %>

 

Al colocar esta directiva en nuestra página de destino, obtenemos una referencia con establecimiento inflexible de tipos (¡bonito palabro!) a nuestra página de origen. Esta directiva tiene dos posibles atributos que son mutuamente excluyentes, VitualPath y TypeName. Es decir, solo podemos utilizar uno de ellos al mismo tiempo.

Ahora, en el code behind de la página de destino tendremos a nuestra disposición la propiedades anteriormente implementadas de forma muy natural y que recuperaremos respectivamente de la siguiente forma dependiendo como las hemos implementado.

            if (PreviousPage != null)
            {
                
if (PreviousPage.IsCrossPagePostBack)
                {
                    sptexto.InnerText 
PreviousPage.NombrePropiedadTexto;
                
}
            }


            
if (PreviousPage != null)
            {
                
if (PreviousPage.IsCrossPagePostBack)
                {
                    sptexto.InnerText 
PreviousPage.NombrePropiedadControl.Text;
                
}
            }

Ni que decir tiene, que no es necesario que las propiedades que exponen los datos a compartir deban necesariamente devolver un control de servidor como hemos visto en este ejemplo. Podemos implementar una propiedad del tipo que necesitemos y recuperarla igualmente por medio de la propiedad PreviousPage.

Veamos ahora una pequeña comparativa de los métodos más usuales para enviar datos entre páginas ASP.NET y tener una visión más general que nos permita elegir adecuadamente en cada caso.

 

  • Compartir datos mediante estado de sesión.
- Cuando utilizamos la sesión para compartir los datos, estos están disponibles para todas las páginas de nuestra aplicación.
- Debemos tener en cuenta que esto supone un consumo relativo de la memoria del servidor.
- Los datos permanecen en memoria hasta que el usuario cierra el explorador y quizás no necesitemos tanta disponibilidad. 
  • Enviar datos como parámetros en la URL
- Permite enviar datos entre páginas de distintas aplicaciones e incluso entre distintas plataformas.
- Se pueden derivar algunos problemas de seguridad al ser siempre visible la información a los usuarios.
- Cantidad de datos limitada por la longitud máxima de la cadena URL.
- Se puede utilizar tanto con controles de servidor como controles HTML.
- Los datos pueden ser enviados programativamente por medio del método Redirect(). 
  • Cross Page PostBack
- Solo se puede utilizar para enviar información a páginas de nuestra aplicación.
- La información enviada no es visible para los usuarios.
- Se pueden enviar grandes cantidades de datos contenidas en propiedades o en controles, por ejemplo un GridView complento.
- Solo es accesible para controles se servidor.
- Programativamente se pueden transferir los datos mediante el método Transfer().
 
 

 


Tags:
Categories: Desarrollo Web
Posted by Oscar.SS on sábado, 08 de mayo de 2010 13:32
Permalink | Comentarios (0) | Post RSSRSS comment feed

GridView: asignar dinámicamente el texto de CommandField

En ocasiones debemos mostrar informes en controles GridView en los que una, o varias, de sus columnas nos permitan seleccionar una fila para realizar una determinada acción en nuestro código. De forma predeterminada el control GridView nos permite añadir columnas de tipo BoundFile, ButtonField, CheckBoxField, CommandField, HyperLinkField, etc.

El problema con estas columnas es que el texto mostrado por pantalla siempre es el mismo en cada fila del GridView. Por ejemplo, "Seleccionar" para una columna CommnadField de tipo ShowSelectButton.

Pero esto no es lo que queremos conseguir. Se trata de que cada fila en una columna determinada por nosotros muestre el texto de los datos de la fuente de datos.

De esta forma cada registro permite seleccionar esa fila para realizar una acción en función de los datos que contiene. ¡Veamos como!. 

Tenemos el siguiente GridView en nuestro formulario:

         <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 

            ondatabound="GridView1_DataBound" 
            onselectedindexchanged
="GridView1_SelectedIndexChanged">
            
<Columns>
                
<asp:CommandField ShowSelectButton="true" ButtonType="Link" HeaderText="Proyecto" />
                <
asp:BoundField DataField="Responsable" HeaderText="Responsable" ReadOnly="True" 
                    SortExpression
="Responsable" />
                <
asp:BoundField DataField="Analista" HeaderText="Analista" 
                    SortExpression
="Analista" />
                <
asp:BoundField DataField="FechaInicio" HeaderText="Fecha Inicio" 
                    SortExpression
="FechaInicio" />
                <
asp:BoundField DataField="FechaFin" HeaderText="Fecha Fin" 
                    SortExpression
="FechaFin" />
            </
Columns>
        
</asp:GridView>


Ahora cargamos el GridView con un DataTable por ejemplo en el evento load.

    protected void Page_Load(object sender, EventArgs e)
    {
        
if (!IsPostBack)
        {
            dt 
= new DataTable();
            
dt.Columns.Add("Proyecto");
            
dt.Columns.Add("Responsable");
            
dt.Columns.Add("Analista");
            
dt.Columns.Add("FechaInicio");
            
dt.Columns.Add("FechaFin");

            int 
contador 0;
            foreach 
(DataColumn colum in dt.Columns)
            {
                DataRow dr 
dt.NewRow();
                
dr["Proyecto""000" + contador.ToString();
                
dr["Responsable""Responsable " + contador.ToString();
                
dr["Analista""Analista " + contador.ToString();
                
dr["FechaInicio""Inicio " + contador.ToString();
                
dr["FechaFin""Fin " + contador.ToString();
                
dt.Rows.Add(dr);
                
contador++;
            
}

            GridView1.DataSource 
dt;
            
GridView1.DataBind();
        
}
    }

En el evento OnDataBound asignamos dinámicamente los datos de la columna CommnadField.

    protected void GridView1_DataBound(object sender, EventArgs e)
    {
        
for (int 0i < dt.Rows.Counti++)
        {
            LinkButton lb 
GridView1.Rows[i].Controls[0].Controls[0as LinkButton;
            
lb.Text dt.Rows[i]["Proyecto"].ToString();
        
}
    }

En este caso la fuente de datos era un DataTable que hemos creado a mano pero podíamos haber utilizado cualquier origen de datos. Por ejemplo, si hubiéramos utilizado un objeto SqlDataSource podríamos recuperar los datos de la forma siguiente.

        DataView dv =  SqlDataSource1.Select(new DataSourceSelectArguments()) as DataView;
        
DataTable dt dv.ToTable();

 

Ahora solo nos queda recoger los datos sobre la celda que pulsa el usuario. Utilizaremos para ello el evento OnSelectedIndexChanged.

    protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
    {
        GridView gv 
(GridView)sender;
        int 
filaSeleccionada gv.SelectedIndex;
        
LinkButton lb gv.Rows[filaSeleccionada].Cells[0].Controls[0as LinkButton;
    
}

Posted by Oscar.SS on domingo, 14 de marzo de 2010 14:09
Permalink | Comentarios (0) | Post RSSRSS comment feed

Ejemplo de CAPTCHA en ASP.NET

Este sencillo ejemplo mostrará como implementar un controlador de peticiones HTTP personalizado para servir una imagen a modo de CAPTCHA. Naturalmente esto es solo un punto de partida muy simple y se podría complicar más para, por ejemplo, construir un control de servidor tipo CAPTCHA.

Para implementar nuestro controlador de peticiones HTTP personalizado debemos utilizar la interfaz IHttpHandler. Esta interfaz define el contrato que deben tener todos los tipos que se utilicen para manejar las peticiones HTTP. De esta forma podemos decidir qué y cómo se devuelve la solicitud desde el servidor.

A continuación dejo el código de la clase que implementa esta funcionalidad.

public class CaptchaHandler : IHttpHandler
{
    
public static string RndTexto { get; set; }
    
private char[] Abc;

    public 
CaptchaHandler()
    {
        Abc 
= new char[]{
            
'A','B','C','D','E','F','G','H','I','J','K','L','M','N','Ñ','O','P','Q','R','S',
            
'T','U','V','W','X','Y','Z'};
        
InitRndTexto();
    
}
    //Creamos un texto aleatorio de 6 letras.
    
private void InitRndTexto()
    {
        Random Rnd 
= new Random();
        
System.Text.StringBuilder Sb = new System.Text.StringBuilder();

        for 
(int 0i < 6i++)
        {
            Sb.Append(Abc[Rnd.Next(
027)]);
        
}

        RndTexto 
Sb.ToString();
    
}

    
#region Miembros de IHttpHandler

    
public bool IsReusable
    {
        
get return false; }
    }

    
public void ProcessRequest(HttpContext context)
    {
        Bitmap Imagen 
= new Bitmap(18080, PixelFormat.Format16bppRgb555);
        
Graphics Grafico Graphics.FromImage(Imagen);

        
//Escribimos el texto.
        
Font Fuente = new Font(new FontFamily("Chiller"), 35, FontStyle.Italic);
        
Grafico.DrawString(RndTexto, Fuente, Brushes.Red, 1015);

        
//Dibujamos dos lineas.
        
for (int 0i < 2i++)
        {
            Point A 
= new Point(5, (35 + i * 10));
            
Point B = new Point(175, (35 + i * 10));
            
Grafico.DrawLine(new Pen(Brushes.Black, 3), A, B);
        
}

        context.Response.ContentType 
"Image/jpeg";
        
Imagen.Save(context.Response.OutputStream, ImageFormat.Jpeg);
    
}

    
#endregion
}

 

No hay mucho que explicar. En primer lugar generamos un texto aleatorio y lo guardamos en el campo RndTexto. Este campo publico podrá ser utilizado por otra clase cliente para comprobar, por ejemplo, que el texto introducido por el usuario coincide con el de la imagen. Después escribimos el texto aleatorio sobre una superficie de dibujo. También dibujamos dos lineas horizontales para dificultar un poco su lectura. 

Debemos registrar en el web.config este controlador HTTP para que ASP.NET sepa que debe hacer cuando entra una petición en el servidor.

      <system.web>
        
<httpHandlers>
            
<add verb="*" type="CaptchaHandler" path="*.captcha"/>
        </
httpHandlers>
      
</system.web>

Con esta configuración estamos indicando (por orden) que para cualquier tipo de petición GET o POST, debe ser manejada por el tipo CaptchaHandler. Por último, indicamos que cuando se solicite un archivo con extensión captcha nuestro controlador debe actuar sirviendo la respuesta implementada en el código.

Desde este momento, siempre que el código cliente solicite una imagen con la extensión indicada, se le servirá nuestro CAPTCHA personalizado. Es decir, al encontrarse con algo como lo siguiente:

        <img alt="" src="sitioWeb.captcha" />

Obtendremos una salida en el explorador cliente como esta.

 

 

Quizás el diseño no sea muy acertado, pero dejo para vosotros el mejorarlo. Wink


Tags:
Categories: Desarrollo Web
Posted by Oscar.SS on domingo, 14 de febrero de 2010 1:55
Permalink | Comentarios (0) | Post RSSRSS comment feed

IHttpModule: Antes y después de la solicitud

La interfaz IHttpModule nos proporciona una manera simple de manejar las peticiones HTTP antes de que estas comiencen a administrarse en IIS y una vez que han sido totalmente ejecutadas y se van a devolver al cliente.

¿Porque razón querríamos actuar en la solicitud antes (y después) de que comience a administrarse? 

  • Por temas de seguridad y rendimiento. Si un usuario no tiene permisos en nuestra aplicación es mejor denegarle el acceso antes de que su solicitud comience a consumir recursos en el servidor.  Comprobamos que no tiene premisos antes del comienzo de ejecución de ninguno de los eventos del ciclo de vida de la página solicitada (o control de usuario, o servicio Web).
  • Para crear módulos estadísticos sobre las solicitudes de forma global en lugar de hacerlo para las páginas de forma individual.
  • Incluir en la respuesta a la solicitud, encabezados y pies de páginas personalizados para todas las solicitudes.
  • En general, siempre que deseemos actuar antes de que comience a ejecutarse la solicitud en el servidor y justo antes de que se envíe la respuesta al cliente.
 
 
 
La forma de implementar un módulo es muy sencilla. Solo tenemos que crear un archivo de clase, por ejemplo Modulo.cs, y implementar la interfaz IHttpModule. Los miembros de esta interfaz son solo dos. 
  • Init(). Inicializa el módulo y lo prepara para procesar la solicitud HTTP.
  • Disponse(). Elimina los recursos utilizados por el módulo.
Es evidente que la lógica de nuestro módulo deberá implementarse en el método Init(). A continuación podemos ver un sencillo ejemplo que comprueba si el usuario tiene permisos, en caso negativo es transferido a una página en la que se muestra un mensaje.
 
public class ClaseModulo : IHttpModule
{
    
public ClaseModulo(){}

    
public void Dispose() { }

    
public string NombreModulo 
    {
        
get return "MiModulo"}
    }

    
public void Init(HttpApplication aplicacion)
    {
        
/*
         * Definimos los eventos del ciclo de vida de la aplicación sobre los que vamos actuar.
         * En este caso actuamos antes del comienzo de la solicitud y cuando esta termina.
         */
        
aplicacion.BeginRequest += new EventHandler(aplicacion_BeginRequest);
        
aplicacion.EndRequest += new EventHandler(aplicacion_EndRequest);
    
}

    
private void aplicacion_BeginRequest(object sender, EventArgs e)
    {
        
//Obtenemos el contexto de aplicación de la solicitud.
        
HttpApplication Aplicacion (HttpApplication)sender;
        
HttpContext Contexto Aplicacion.Context;

        
//Obtenemos la extensión del archivo solicitado.
        
string Ruta Contexto.Request.FilePath;
        string 
Extension VirtualPathUtility.GetExtension(Ruta);

       
//Si se ha solicitado una página aspx.
        
if (Extension.Equals(".aspx"))
        {
            
//Si el usuario no tiene permisos le enviamos a la página de error.
            
if (!UserTienePermisos())
            {
                Contexto.Server.Transfer(
"Default2.aspx");
            
}
        }
    }

    
private void aplicacion_EndRequest(object sender, EventArgs e)
    {
        
//Obtenemos el contexto de aplicación de la solicitud
        
HttpApplication Aplicacion (HttpApplication)sender;
        
HttpContext Contexto Aplicacion.Context;

        
//Obtenemos el nombre del archivo solicitado.
        
string Ruta Contexto.Request.FilePath;
        string 
Extension VirtualPathUtility.GetExtension(Ruta);

        if 
(Extension.Equals(".aspx"))
        {
            
//Si el usuario no tiene permisos mostramos un mensaje al final de la solicitud.
            
if (!UserTienePermisos())
            {
                Contexto.Response.Write(
"Usted no tiene permisos");
            
}
        }
    }
}
 
Una vez codificada la lógica de nuestro módulo debemos registrarlo en el web.config para ASP.NET tenga en cuenta como tiene que manejar la solicitud.
        <system.web>
            
<httpModules>
                
<add name="MiModulo" type="ClaseModulo"/>
            </
httpModules>
        
</system.web>

Posted by Oscar.SS on sábado, 30 de enero de 2010 14:23
Permalink | Comentarios (0) | Post RSSRSS comment feed

Recopilación y actualización a la versión .NET 4.0

Con motivo del cercano lanzamiento de .NET Framework 4.0, me ha dado por actualizar la información que tenía en este blog de la evolución de .NET desde la versión 1.0. Por ello me he kurrado un gráfico que creo servirá para aclarar el tema del versionado de Microsoft que ciertamente es un jaleo :-(

Y ya de paso he aprovechado para modificar un poco las páginas que podéis encontrar en el menú de la izquierda, donde pone Páginas Extra, referentes a las novedades de C# 2.0C# 3.0C# 4.0. Bueno, en realidad la última versión del lenguaje no la he incluido, aún estoy recopilando la información...sorry!!.

Aquí os dejo el gráfico (click para ampliar).

 

 

Mi idea principal con este gráfico, es dejar más clara la evolución de las tecnologías disponibles en cada versión del framework en cuando a desarrollo con ASP.NET.

Por este motivo podéis encontrar en la fila correspondiente a ASP.NET (color rojo) algunas tecnologías que se han incluido en el framework pero que en realidad no pertenecen al núcleo de ASP.NET. Pero si tienen mucho que ver con el desarrollo web en ASP.NET.

Como referencia, comentar que parte de la información la he extraido del libro de José Manuel Alarcón titulado muy acertadamente "Tecnologías ASP.NET 4.0 (Saltando desde la versión 2.0)".

Por otra parte, animo a todos a comentar cualquier cosilla que se me pase por alto o que sea de interés común incluirlo en el gráfico. 


Posted by Oscar.SS on jueves, 14 de enero de 2010 22:00
Permalink | Comentarios (0) | Post RSSRSS comment feed

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

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.

 


Tags:
Categories: Desarrollo Web
Posted by Oscar.SS on lunes, 28 de diciembre de 2009 15:04
Permalink | Comentarios (0) | Post RSSRSS comment feed

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

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.

 


Tags:
Categories: Desarrollo Web
Posted by Oscar.SS on lunes, 21 de diciembre de 2009 23:03
Permalink | Comentarios (0) | Post RSSRSS comment feed

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

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.

 

Ver también como Acceder a las propiedades y controles de una ContentPage desde una MasterPage


Tags:
Categories: Desarrollo Web
Posted by Oscar.SS on lunes, 21 de diciembre de 2009 21:33
Permalink | Comentarios (0) | Post RSSRSS comment feed