Recién me preguntaron, como se podia modificar el acceso de un control dentro de un WebControl para que sea publico. Esta accion en Visual Studio 2003, era bastante simple, ya que simplemente modificabamos el atributo protected por public del mismo, en la sección Web Designer Generated Code Por ejemplo la declaracion de un TextBox;
|
Protected WithEvents TextBox1 As System.Web.UI.WebControls.TextBox
|
Se modificaba por
|
Public WithEvents TextBox1 As System.Web.UI.WebControls.TextBox
|
De esta manera, luego se podia acceder al control interno del WebControl desde la pagina que contenia al WebControl.
|
Me.WebUserControl11.TextBox1.Text = "Hola"
|
Sin embargo, en Visual Studio 2005, esto no es posible ya que la clase de código asociado al WebControl es parcial y no contiene la definicion de los controles del WebControl (las definiciones se generan dinamicamente al momento de compilar). Esta caracteristica es nueva del compilador de ASP.NET 2.0. El compilador de ASP.NET (aspnet_compiler.exe) fue introducido originalmente en ASP.NET 2,0 como manera totalmente de precompilar un sitio entero, permitiendo no desplegar nada salvo assemblies. Esto es interesante porque elimina cualquier compilación a pedido cuando se hacen las peticiones, eliminando el primer post deployment. Pero de esta manera también se hace más difícil que las modificaciones sean hechas a un sitio ya desplegado (puesto que no se puede editar archivos aspx y modificarlos).
El compilador liberado con ASP.NET 2,0 soporta este modelo de despliegue, pero lo también se ha modificado para soportar un modelo actualizable del despliegue. Este modelo es posible debido a la reintroducción de la herencia en el modelo del codebehind, para poder ser generado y compilar las clases parciales del WebControl que contienen declaraciones del control independientemente de las definiciones reales de la clase.
Despues de probar varias opciones (5 min.) se me ocurrio que tal vez el migrador de proyectos a Asp.Net 2.0, me podria dar la respuesta, y asi fue. Una vez migrado el proyecto, en el log de migracion, me encontré con el siguiente mensaje:
|
=========================ERRORS=================== ERROR: The member declaration for ‘TextBox1’ was removed and its accessibility has been changed from ‘public’ to ‘protected’. To access this member from another page you should create a public accessor property for it. WebUserControl1.ascx.vb
|
Asi que siguiendo las recomendaciones de Microsoft, la solución fue publicar este control en una nueva propiedad en el WebControl. Por ejemplo:
|
Public Property myTextBox1() As System.Web.UI.WebControls.TextBox Get Return Me.TextBox1 End Get Set(ByVal value As System.Web.UI.WebControls.TextBox) Me.TextBox1 = value End Set End Property |
Todos los días aprendemos algomas de los interesanes cambios de Asp.Net 2.0.
Saludos
El Bruno
Leave a reply to John Cancel reply