2012-03-07 14 views
51

He estado trabajando en un proyecto .NET Framework 4 usando etiquetas de servidor como <% = whatever%> para establecer la visibilidad de los controles runat = "server", como los siguientes:Establecer propiedad visible con etiqueta de servidor <%= %> en Framework 3.5

<div id="MyId" runat="server" visible="<%=MyVisiblePropertyOnCodeBehind %>" > 
    Content 
    </div> 

esto funciona en el marco 4, pero ahora tratando de utilizar esto en un proyecto Framework 3.5 no parece funcionar. ¿Es esta una característica única de Framework 4? ¿Existe una alternativa más genial (y .aspx) a la configuración de la visibilidad del código subyacente? Estoy usando la fea:

MiId.Visible = MyVisiblePropertyOnCodeBehind 

Gracias de antemano,

Tom

[Editado] SOLUCIÓN:

Gracias por sus comentarios que me hace entender mi problema y la ¡solución!

Fue mi culpa en más de una cosa.

En el proyecto VS2010 que estaban usando <% # en lugar de <% =

Además, no me di cuenta de que en el proyecto de VS2010 que estábamos usando páginas no heredan de “página”, pero desde un CustomPage clase, que estaba haciendo el enlace de forma automática, sin que yo lo notara, y eso me hace pensar que era una función de Framework 4.0 solamente.

Como se dijo aquí, si usted tiene la siguiente marcado:

<div id="MyId" runat="server" visible="<%# MyVisiblePropertyOnCodeBehind %>" > 
    Content 
    </div> 

se puede hacer que funcione, añadiendo lo siguiente en el código subyacente:

public bool MyVisiblePropertyOnCodeBehind = true; 
    protected void Page_Load(object sender, EventArgs e) { 
     DataBind(); 
     // Or if you want only for one control, MyId.DataBind();    
    } 

A medida que leía, este DataBind () puede reducir el rendimiento de la aplicación. ¿Tienes idea de cuánto? ¿Podría entenderse esto como una técnica "profesional" para usar en grandes proyectos, o cree que debería evitarse?

Me encanta la forma en que hace que el marcado sea legible y fácil de entender en una sola vista, pero no me gustaría ser culpable de código lento debido a eso.

+0

¿Qué es la firma de su propiedad 'MyVisiblePropertyOnCodeBehind'? – PraveenVenu

+0

En realidad, no creo que sea feo establecerlo en código. Establezca 'visible =" false "' como predeterminado en el frente del código si desea un recordatorio de que el control no es necesariamente visible. – mac9416

Respuesta

69

El código que envió no es una sintaxis válida para las etiquetas del servidor en los tiempos de ejecución de ASP.NET 2.0 o ASP.NET 4.0. En cualquiera de las versiones, tratando de establecer la propiedad visible mediante <%= ... %> en una etiqueta de servidor debe dar lugar a un error del analizador:

Parser Error Message: Cannot create an object of type 'System.Boolean' from its string representation '<%=MyVisiblePropertyOnCodeBehind%>' for the 'Visible' property.

Tiene dos opciones que no sean sólo de establecer la propiedad Visible en el código subyacente o una etiqueta <script runat="server">. El primero es usar un enlace de datos en la propiedad Visible. Tendrá que llamar al método DataBind() en MyId o en uno de sus controles principales para vincular el valor.

<div id="MyId" runat="server" visible="<%# MyVisiblePropertyOnCodeBehind %>" > 
    Content 
</div> 

La otra opción es escribir el código de la siguiente manera:

<% if(MyVisiblePropertyOnCodeBehind) { %> 
<div id="MyId" runat="server"> 
    Content 
</div> 
<% } %> 

La desventaja de este enfoque es que usted no será capaz de agregar mediante programación controles a la página o control que contiene el bloques de código. Si intenta usted debe conseguir un error:

The Controls collection cannot be modified because the control contains code blocks (i.e. <% ... %>)

dicho todo esto, creo que acaba de establecer la propiedad de la manera que lo está haciendo ahora es el camino a seguir.

+0

Finalmente entendí mi problema gracias a esto, y los enlaces en el mensaje "arunes". Gracias. (lo siento pero soy nuevo y no puedo votar). – tomasofen

+0

¡Genial, me alegro de poder ayudarte! – rsbarro

+1

@rsbarro He encontrado otra rareza usando un bloque '<% if', de modo que los errores de validación se lanzan en la devolución de datos. Si el bloque contiene un RequiredFieldValidator que no se debe representar, la devolución de datos seguirá utilizándolo como si existiera y provocara un error de validación. Descubrí que todavía tenía que usar una expresión booleana para establecer 'Enabled = '<%# false %>'' y llamar 'someControlId.DataBind();' en el código detrás de Page_Load para desactivar el validador en la devolución de datos. – AaronLS

3

As for ASP.NET aspx page's inline expression. <% %> can only be used at aspx page or user control's top document level, but can not be embeded in server control's tag attribute (such as <asp:Button... Text =<% %> ..>). As you've found you can create custom expression builder in ASP.NET 2.0 to add your inline expression.

BTW, another means for supplying values to server control properties in aspx inline tempalte is using <%# %> databinding expression. This is built-in supported. The only different from other inline expression is that method on the target control or its Container control.

Steven Cheng

Microsoft MSDN Online Support Lead

post completo aquí: http://www.aspnet-answers.com/microsoft/ASP-NET/29389067/dynamically-set-a-control-property.aspx

Y solución aquí: ASP.net Inline Expression Issue

3

acaba de establecer una variable de verdadero/falso en su caso pageLoad como esto

private bool IsEditMode {get; set;}  

protected bool IsVisible 
{ 
    get { retun IsEditMode ;} 
    set { IsEditMode =value;} 
} 

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!Page.IsPostBack) 
    { 
     // based on some condition set this to true or false 
     isEditMode=true; 
    } 
} 

Luego, en sus propiedades de control dentro de la página aspx, defina su visibilidad a través de una propiedad como

Visible="<%# !IsEditMode %>" 
+0

Lo siento, pero esto no está relacionado con la pregunta, y el código es confuso, con diferentes nombres de propiedad :( – tomasofen

+0

@tomasofen He actualizado mi respuesta con nombres adecuados. –

1

Aquí está otro enfoque que mantiene la simplicidad del código de su pregunta original. Aquí tendría que eliminar runat = "server" de la etiqueta div y usar css "display: none" en lugar de la propiedad "Visible". La desventaja de este enfoque es que la etiqueta aún se envía al navegador incluso si no está visible y la visibilidad se maneja en el lado del cliente.

<div style='<%=MyVisiblePropertyOnCodeBehind ? "" : "display: none" %>' > 
    Content 
</div> 
Cuestiones relacionadas