Controles Windows en Web
[WebControl]

Fecha: 25/Ago/2003 (25/Ago/2003)
Autor: Unai Zorrilla Castro('molotess') Escríbeme

 
.

Introducción
Vamos a indagar un poco en otro de los muchos cambios que proporciona el nuevo paradigma de programación .NET. Hasta ahora cuando queríamos embeber un control en Web la única solución que teníamos eran los controles ActiveX ( controles sobre los cuales hay secciones en esta Web). Como era de esperar Microsoft propone una alternativa en el mundo .NET, esta alternativa es la creación de una Biblioteca de controles Windows. En esta colaboración veremos como y que limitaciones tienen. Como para muestra un botón empezamos la colaboración creando un ejemplo simple. Aprovecharemos para este ejemplo la biblioteca para crear PDF que está expuesta en mi anterior colaboración. Empezamos creando un nuevo proyecto en el Visual Studio, elegimos el Template Biblioteca de Controles Windows y le damos un nombre, en este caso TestControl. Se nos mostrará un pequeño formulario al estilo Windows. Lo primero es agregar las referencias necesarias para usar PDFCreate. Una vez hecho esto agregamos una Label y un botón. En el Click del botón escribimos lo siguiente .

 

using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Windows.Forms;
using PDFCreate;

namespace TestControl
{
    /// 
    /// Descripción breve de UserControl1.
    /// 
    public class UserControl1 : System.Windows.Forms.UserControl
    {
        private System.Windows.Forms.Button button1;
        private System.Windows.Forms.Label label1;
        /// 
        /// Variable del diseñador requerida.
        /// 
        private System.ComponentModel.Container components = null;

        public UserControl1()
        {
            // Llamada requerida por el Diseñador de formularios Windows.Forms.
            InitializeComponent();

            // TODO: agregar cualquier inicialización después de llamar a InitForm

        }

        /// 
        /// Limpiar los recursos que se estén utilizando.
        /// 
        protected override void Dispose( bool disposing )
        {
            if( disposing )
            {
                if( components != null )
                    components.Dispose();
            }
            base.Dispose( disposing );
        }

        #region Component Designer generated code
        ///  
        /// Método necesario para admitir el Diseñador, no se puede modificar 
        /// el contenido del método con el editor de código.
        /// 
        private void InitializeComponent()
        {
            this.button1 = new System.Windows.Forms.Button();
            this.label1 = new System.Windows.Forms.Label();
            this.SuspendLayout();
            // 
            // button1
            // 
            this.button1.Location = new System.Drawing.Point(16, 64);
            this.button1.Name = "button1";
            this.button1.Size = new System.Drawing.Size(136, 23);
            this.button1.TabIndex = 0;
            this.button1.Text = "Crear PDF";
            this.button1.Click += new System.EventHandler(this.button1_Click);
            // 
            // label1
            // 
            this.label1.Location = new System.Drawing.Point(32, 24);
            this.label1.Name = "label1";
            this.label1.TabIndex = 1;
            // 
            // UserControl1
            // 
            this.Controls.AddRange(new System.Windows.Forms.Control[] {
                                                                          this.label1,
                                                                          this.button1});
            this.Name = "UserControl1";
            this.Size = new System.Drawing.Size(176, 104);
            this.ResumeLayout(false);

        }
        #endregion

        private void button1_Click(object sender, System.EventArgs e)
        {    
            NewPDF doc = new NewPDF(@"C:\TestControl.pdf");
            doc.Create();
            doc.AddTexto("Hola Mundo!!");
            doc.Dispose();
            label1.Text = "Doc Creado!";
        
        }
    }
}



Ya tenemos nuestro primer Control. Generamos la solución. Ha llegado el momento de probarlo para ello podemos probarlo en un formulario de Windows o en la Web, es recomendable probarlo antes en un formulario Windows. Para ello Creamos una aplicación Windows. En el cuadro de herramientas hacemos Click con el botón derecho y pinchamos en personalizar cuadro de herramientas, nos saldrá el siguiente cuadro de diálogo.



Elegimos Componentes del .Net FrameWork y en el botón examinar buscamos la dll del control. Una vez hecho esto en el cuadro de herramientas se nos mostrará un nuevo componente. Solo tenemos que agregarlo al formulario y ejecutar la aplicación. Si todo está bien llego el momento de probarlo en la Web. Para ello en InetPub/wwwroot/ creamos un documento html con el siguiente tag dentro del body del documento

<object classid="http://localhost/lib/TestControl.dll#TestControl.UserControl1" VIEWASTEXT>No se puede mostrar el control</object>.

Explico que es cada cosa, el atributo classid se usaba y se usa tambièn con ActiveX para exponer el identificador del objecto ActiveX( COM ) que no era más que un número único que servía para identificar el objeto,además teníamos un atributo codebase para especificar donde teníamos el CAB que el cliente se tenía que descargar par poder usar el ActiveX. Con .NET esto ha cambiado puesto que no tenemos que descargar nada puesto que el componente se compila en el compilador Just In Time de FrameWork. ¿ Que representa ahora el atributo classid ? Pues bien, la primera parte, antes de la # representa el path hacia la librería, en mi caso la he puesto dentro de una carpeta llamada lib al lado del html. Despues del carácter # se escribe le NameSpace de la librería,un . , y la clase de la librería. En nuestro caso el NameSpace es TestControl y la clase UserControl1. Ojo esto es CaseSensitive si los escribimos mal no funcionará.

Bueno podéis probar el ejemplo, está incluído dentro del zip que hay abajo dentro de la carpeta wwwroot. ¿ Que pasa ? ERROR verdad ¿ Porqué ? Bueno porque estamos usando código no manejado y el FrameWork no nos dá permiso para poder hacerlo. ¿ Como lo solucionamos ? Simple vamos a Herramientas administrativas y en el Asistente de Microsoft .Net en seguridad le podemos dar por ahora Plena Confianza a Intranet, después explicaré como dar permisos a esta assembly o a otra. Lo hacemos y veremos que ahora funciona. ok, ya hemos creado nuestro primer control embebido en la Web, Felicidades.

Si quieres distribuirlo en la WWW te recomiendo que leas más abajo.

 





Nota importante.

Para poder distribuir un control en Internet son necesarios dos pasos, el primero es que el control tenga nombre seguro y el segundo que el cliente que lo use le de los permisos adecuados dependiendo del trabajo que realice el control. Para lo segundo podéis crear un grupo para esta assemblie en Herramientas Administrativas->Configuración de FrameWork o bien crear un .bat para que lo ejecute el cliente de esa página web, esto es lo que yo hago. Y os pongo un ejemplo de escript

cd c:\Windows\Microsoft.Net\Framework\v1.14322\
V1.1.4322 depende de la versión del Framework
Ahora vamos a darle permisos al control
caspol -addgroup 1.1 -url http://www.eldominioDelControl.es/* FulTrust -exclusive on -name NombreDelGrupo
La condición de pertenencia puede ser url site hash sn etc..

Una vez que los clientes le han dado permisos al control ( podéis revisar la SDK del FrameWork sobre como usar caspol) ya podrán ver y usar el control.



 

Fichero con el código de ejemplo (unaiTestControl - 778 KB)


ir al índice