2011-04-08 47 views
18

en mi .aspx Estoy buscando agregar una declaración If basada en un valor proveniente del enlace. He intentado lo siguiente:ASP.NET usando Bind/Eval en .aspx en la instrucción If

<% if(bool.Parse(Eval("IsLinkable") as string)){ %>      
     monkeys!!!!!! 
     (please be aware there will be no monkeys, 
     this is only for humour purposes) 
<%} %> 

IsLinkable es un bool que viene del Binder. Me sale el siguiente error:

InvalidOperationException 
Databinding methods such as Eval(), XPath(), and Bind() can only 
be used in the context of a databound control. 

Respuesta

19

Debe agregar su lógica al evento ItemDataBound de ListView. En el aspx no puede tener un enunciado if en el contexto de un DataBinder: <%# if() %> no funciona.

un vistazo aquí: http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.listview.itemdatabound.aspx

El evento serán levantados para cada elemento que se une a su ListView y por lo tanto el contexto en el evento está relacionado con el artículo.

ejemplo, ver si se puede ajustar a su situación:

protected void ListView_ItemDataBound(object sender, ListViewItemEventArgs e) 
{ 
    if (e.Item.ItemType == ListViewItemType.DataItem) 
    { 
     Label monkeyLabel = (Label)e.Item.FindControl("monkeyLabel"); 
     bool linkable = (bool)DataBinder.Eval(e.Item.DataItem, "IsLinkable"); 
     if (linkable) 
      monkeyLabel.Text = "monkeys!!!!!! (please be aware there will be no monkeys, this is only for humour purposes)"; 
    } 
} 
+0

Creo que el problema es que está incrustando una declaración en algo que espera una expresión. – asawyer

+0

@asawyer Me parece una buena explicación. Realmente no lo he pensado de esta manera, pero tiene mucho sentido. – Bazzz

+1

Esto también se aplica al control Repeater. – Bern

0

Habría que ver el resto del código, pero el mensaje de error que me está dando un poco de una pista. SOLAMENTE puede usar Eval cuando se encuentre dentro de un control de enlace de datos. Algo como un repetidor, cuadrícula de datos, etc.

Si se encuentra fuera de un control de datos enlazados, puede cargar el valor en una variable en el código subyacente y hacerlo público. Entonces podrías usarlo en ASPX para el procesamiento condicional.

+0

sí, está en un control ListView – Funky

14

Estoy bastante seguro de que puede hacer algo como lo siguiente

(Nota no tengo un compilador práctico probar la sintaxis exacta)

text = '<%# string.Format("{0}", (bool)Eval("IsLinkable") ? "Monkeys!" : string.Empty) %>' 

Sí, esto es C# y su uso de vb.net, por lo que tendrá que utilizar la sintaxis de VB para un operador ternario.

Editar - fue capaz de lanzarse a una situación de enlace de datos simple, funcionó como un amuleto.

+1

El OP no utiliza 'vb' sino' C# '(ver etiquetas), por lo que su ejemplo es relevante. Sin embargo, creo que tendrás que comenzar con '<% #', pero corrígeme si me equivoco. – Bazzz

+0

@Bazzz Oh, mira eso, es C#. ¡Aun mejor! Además, tienes razón de que sea <% #, actualizaré la respuesta. – asawyer

1

Siempre que he necesitado manejar condiciones dentro de un control de datos, utilizo el evento OnItemDataBound.

por lo que podría hacer:

protected void DataBound_ItemDataBoundEvent() { 
    bool IsLinkable   = (bool)DataBinder.Eval(e.Item.DataItem, "IsLinkable"); 
    if(IsLinkable) { 
      //do stuff 
    }          

} 
0

Para FormView de control se refiere a this link.

Aquí está el código de muestra.Mi página aspx FormView control parezca a continuación:

<asp:FormView ID="fv" runat="server" Height="16px" Width="832px" 
CellPadding="4" ForeColor="#333333" ondatabound="fv_DataBound"> 
    <ItemTemplate> 
     <table> 
      <tr> 
       <td align="left" colspan="2" style="color:Blue;"> 
        <asp:Label ID="lblPYN" runat="server" Text='<%# Eval("PreviousDegreeYN") %>'></asp:Label> 
       </td> 
      </tr> 
     </table> 
    </ItemTemplate> 
</asp:FormView> 

estoy comprobando el valor de <%# eval("PreviousDegreeYN") %>

Si mi eval("PreviousDegreeYN") == True, quiero mostrar en mi etiqueta "lblPYN"

protected void fv_DataBound(object sender, EventArgs e) 
{ 
    FormViewRow row = fv.Row; 
    //Declaring Variable lblPYN 
    Label lblPYN; 
    lblPYN = (Label)row.FindControl("lblPYN"); 
    if (lblPYN.Text == "True") 
    { 
     lblPYN.ForeColor = Color.Blue; 
     lblPYN.Text = "Yes"; 

    } 
    else 
    { 
     lblPYN.ForeColor = Color.Blue; 
     lblPYN.Text = "No"; 

    } 
} 
4

Si tiene problemas para obtener e.Item.DataItem en la respuesta de Bazzz, intente

protected void ListView_ItemDataBound(object sender, ListViewItemEventArgs e) 
{ 
    using (ListViewDataItem listViewDataItem = (ListViewDataItem) e.Item) 
    { 
     if (listViewDataItem != null) 
     { 
      Label monkeyLabel = (Label)e.Item.FindControl("monkeyLabel"); 
      bool linkable = (bool)DataBinder.Eval(listViewDataItem , "IsLinkable"); 
      if (linkable) 
       monkeyLabel.Text = "monkeys!!!!!! (please be aware there will be no monkeys, this is only for humour purposes)"; 
     } 
    } 
} 
4

Sé que es un poco tarde en el día para esta respuesta, pero para lo que vale aquí está mi solución al problema:

<%# (bool)Eval("IsLinkable") ? "monkeys!!!!!!" : "" %> 
2

puede crear un método para evaluar el valor y devuelve el valor que quieres

<%# IsLinkableABool(Eval("IsLinkable")) %> 

En el código subyacente puede crear el método que se siga

protected String IsLinkableABool(String isLinkable) 
{ 
    if (isLinkable == Boolean.TrueString) 
    { 
     return "monkeys!!!!!! (please be aware...";  
    } 
    else 
    { 
     return String.Empty; 
    } 
} 
+0

SOLUCIÓN IMPRESIONANTE ... Lo siento por las tapas! Salvaste mi día :) – SearchForKnowledge

5

Puede utilizar asp:PlaceHolder y en el visible puede poner eval. Al igual que la siguiente

<asp:PlaceHolder ID="plc" runat="server" Visible='<%# Eval("IsLinkable")%>'> 
     monkeys!!!!!! 
     (please be aware there will be no monkeys, this is only for humour purposes) 
    </asp:PlaceHolder> 
0

Poner la página aspx condición no es una buena idea.also desordenado. U puede hacerlo utilizando un operador ternario. Pero le sugiero que use los eventos rowdatabound de la vista de cuadrícula. paso 1: vaya a propiedades de la vista de cuadrícula. Haga clic en el botón de encendido para ver un listado de todos los eventos. Paso 2- dar un nombre en RowDataBound y haga doble clic

protegida onrow vacío (remitente del objeto, GridViewRowEventArgs e)

{ 
    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
     TableCell statusCell = e.Row.Cells[8];//Means column 9 

     if (statusCell.Text == "0") 
     { 
      statusCell.Text = "No Doc uploaded"; 

     } 
     else if (statusCell.Text == "1") 
     { 
      statusCell.Text = "Pending"; 
     } 
     else if (statusCell.Text == "2") 
     { 
      statusCell.Text = "Verified"; 
     } 
    } 
} 
1

OMG esto tuvo totalmente demasiado tiempo para averiguar ...

<asp:PlaceHolder runat="server" Visible='<%# Eval("formula.type").ToString()=="0" %>'> Content <asp:PlaceHolder>

formula.type es una columna int de la tabla vinculada. Gracias por las otras contribuciones para obtener mi resolución.

Cuestiones relacionadas