2012-01-22 14 views
9

¿Es posible acceder a las propiedades no definidas en el control de usuario? Quiero agregar cualquier atributo html sin definirlo en codebehind.asp.net UserControl properties

ejemplo:

<my:TextBox runat="server" extraproperty="extravalue" /> 

donde extraporperty no está definido en el control del usuario, pero todavía genera:

<input type="text" extraproperty="extravalue" /> 

necesito esta en control de usuario personalizado. Observe el mi: antes del cuadro de texto.

ty!

+0

¿Qué aspecto tiene tu .ascx? –

Respuesta

7

Sí, es posible. ¡Solo inténtalo!

Por ejemplo,

<asp:TextBox ID="MyTextBox" runat="server" extraproperty="extravalue" /> 

renders como:

<input name="...$MyTextBox" type="text" id="..._MyTextBox" extraproperty="extravalue" /> 

Editar

de:

asp: cuadro de texto no es un control de usuario personalizado

Lo anterior va a trabajar para un control de servidor personalizado (derivado de WebControl), pero no para un control de usuario, porque un control de usuario no tiene una etiqueta en la que se puede colocar el atributo: sólo hace que su contenido.

Así que necesitaría un código en su clase UserControl para agregar su atributo personalizado a uno de sus controles secundarios. El control de usuario a continuación, podría exponer el atributo personalizado como una propiedad, algo así como:

// Inside the UserControl 
public string ExtraProperty 
{ 
    get { return myTextBox.Attributes["extraproperty"]; } 
    set { myTextBox.Attributes["extraproperty"] = value; } 
} 

// Consumers of the UserControl 
<my:CustomUserControl ... ExtraProperty="extravalue" /> 
+2

asp: cuadro de texto no es un control de usuario personalizado – LZW

+0

LZW ¿y qué? ________ – Evgeny

4

En realidad no tiene que declarar propiedades para utilizarlos como atributos. Tome este ejemplo muy simple:

<%@ Page Language="C#" CodeFile="Default.aspx.cs" Inherits="_Default" %> 
<%@ Register TagPrefix="uc" TagName="Test" Src="~/UserControls/Test.ascx" %> 

<uc:Test runat="server" extraproperty="extravalue" /> 

Dentro archivo de código de control de usuario puede obtener el valor de cualquier propiedad como esta:

protected void Page_Load(object sender, EventArgs e) 
{ 
    string p = Attributes["extraproperty"]; 
} 

Como se puede ver, todos los atributos que se ponen en su usuario el control se puede leer a través de la colección Attributes usando el nombre de los atributos como la clave para obtener el valor de la colección.

0

Sí, eche un vistazo a la interfaz IAttributeAccessor. el objeto UserControl de ASP.NET implementa explícitamente esta interfaz. Esto permite que cualquier atributo agregado directamente al control en el marcado se transfiera a la colección de atributos del lado del servidor.

Tenga en cuenta que la implementación predeterminada en UserControl no es sobresigible, pero escribe y lee desde su colección de atributos internos.Para hacer que estos atributos a HTML en el control de usuario, hacer algo como esto en el marcado:

<div runat="server" ID="pnlOutermostDiv"> 
// control markup goes here 
</div> 

a continuación en el código subyacente del control de usuario hacer algo como esto:

protected override void OnPreRender(EventArgs e) 
{ 
    foreach (string key in Attributes.Keys) 
    { 
     pnlOutermostDiv.Attributes.Add(key, Attributes[key]); 
    } 

    base.OnPreRender(e); 
} 

Ahora, cuando usted hace uso del control de la siguiente manera:

<my:TextBox runat="server" extraproperty="extravalue" /> 

va a proporcionar de esta manera:

<div id="ctl00_blablabla_blablabla" extraproperty="extravalue"> 
// rendered control HTML here 
</div>