2010-08-11 19 views
21
<% if(Eval("SaveDate") != DBNull.Value){ %> 
    do magic       
<%} %> 

me da error: Los métodos de enlace de datos como Eval(), XPath() y Bind() solo se pueden utilizar en el contexto de un control de datos.eval en la declaración if?

Podría escribir: <% # Eval ("SaveDate")! = DBNull.Value? hacer magia Pero necesito hacer mucha magia html en la declaración if.

Sé que debo agregar # para utilizar Eval, pero no estoy seguro acerca de la sintaxis correcta.

Respuesta

30

Uno La solución es envolver el contenido en una etiqueta runat = "server" con un valor visible, por ejemplo,

<div runat="server" Visible='<%# Eval("SaveDate") != DBNull.Value %>'> 
    do magic 
</div> 

div puede ser cualquier etiqueta HTML, pero <asp:Panel> y <asp:PlaceHolder> también se pueden usar. Tenga en cuenta que "do magic" sigue vinculado a los datos, por lo que no es una solución perfecta si contiene código o código caro que podría generar un error si Eval("SaveDate") == DBNull.Value.

Tenga en cuenta que Visible="false" omitiremos la etiqueta y todo su contenido desde el HTML generado, esto significa que es muy diferente de style="display:none" o style="visible:hidden", por lo que no se preocupe por eso.

Pero, si su "hacer magia" es, otra solución razonablemente complejo bastante simple (un poco de un truco) es: utilizar un repetidor (o FormView) con su origen de datos se establece en una matriz de un elemento (visible) o artículos (ocultos):

<asp:Repeater runat="server" DataSource='<%# ElementIfTrue(Eval("SaveDate") != DBNull.Value) %>' 
    <ItemTemplate> 
     do magic 
    </ItemTemplate> 
</asp:Repeater> 

protected IEnumerable ElementIfTrue(bool condition) 
{ 
    if (condition) 
     return new object[] { Page.GetDataItem() }; 
    else 
     return new object[0]; 
} 

los contenidos reales de la matriz fuente de datos está vacío (oculto) o el elemento que ya eran vinculantes a. Esto asegura que todavía puede llamar al <%# Eval(...) %> dentro de ItemTemplate.

Con este enfoque, su "hacer magia" es una plantilla que solo se ejecutará si DataSource tiene uno o más elementos. El cual es atendido por ElementIfTrue. Es un poco emocionante, pero puede salvarte de vez en cuando.

Como nota al margen: empaquetar su "magia" en un control de usuario también puede mantener la complejidad baja. Realmente no necesita cambiar nada en su combinación de etiquetas HTML/ASP.NET (<%# Eval("...") %> aún funciona incluso dentro de un control de usuario).

+0

Utilizo este código en el repetidor, por lo que no puedo usar marcadores de posición ni ninguna ID del código. –

+0

FYI: No puedo usar la pantalla: ninguno, ya que Google indexa el texto que está oculto en la pantalla none block. No puedo usar Visible = false, ya que es un repetidor y no puedo usar ID. Podría ocultarlo solo mediante el uso de la declaración if. –

+0

Puede enlazar datos a Visible, es una propiedad en cada control del lado del servidor. Simplemente intente '

won't be there!
' dentro de su Repetidor; encontrará que todo el div se ha ido del HTML cuando llama a su página y ve la fuente. – Ruben

8

Yo suelo añadir una función protegida devolver una cadena en el código subyacente para generar el contenido:

En la página:

<%# Eval("SaveDate") != DBNull.Value ? GenerateContent() : string.Empty %> 

En mi clase:

protected string GenerateContent() 
{ 
    return "Hello, World!" 
} 
+1

¿Qué pasa si quiero devolver mucha magia :) como bloques html y demás ... ¿Debería seguir usando un método de codebehind para eso? –

Cuestiones relacionadas