web-dev-qa-db-fra.com

ASP.NET utilisant Bind/Eval dans .aspx dans l'instruction If

dans mon .aspx, je cherche à ajouter une instruction If basée sur une valeur provenant de la liaison. J'ai essayé ce qui suit:

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

IsLinkable est un bool venant du classeur. Je reçois l'erreur suivante:

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

Vous devez ajouter votre logique à l'événement ItemDataBound de ListView. Dans l'aspx, vous ne pouvez pas avoir une instruction if dans le contexte d'un DataBinder: <%# if() %> ne fonctionne pas.

Regardez ici: http://msdn.Microsoft.com/en-us/library/system.web.ui.webcontrols.listview.itemdatabound.aspx

L'événement sera déclenché pour chaque élément lié à votre ListView. Par conséquent, le contexte de l'événement est lié à l'élément.

Exemple, voyez si vous pouvez l’adapter à votre situation:

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)";
    }
}
19
Bazzz

Je suis sûr que vous pouvez faire quelque chose comme ce qui suit 

(Notez que je n'ai pas de compilateur à portée de main pour tester la syntaxe exacte)

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

Oui, c # et votre utilisation de vb.net, vous devrez donc utiliser la syntaxe vb pour un opérateur ternaire.

Edit - a été capable de plonger dans une situation de liaison de données simple, a fonctionné comme un charme.

15
asawyer

Vous pouvez utiliser asp:PlaceHolder et dans Visible can put eval. Comme ci-dessous

   <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>
7
Rakesh Angre

Je sais qu'il est un peu tard dans la journée pour cette réponse, mais voici ce que je peux faire pour résoudre ce problème:

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

OMG cela a pris trop de temps à comprendre ...

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

formula.type est la colonne int d'une table liée. Merci pour les autres contributions pour obtenir ma résolution.

4
Alec Effrat

Si vous rencontrez des problèmes pour obtenir e.Item.DataItem dans la réponse de Bazzz, essayez 

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
Jonathan Robbins

Vous pouvez créer une méthode pour évaluer la valeur et renvoyer la valeur souhaitée.

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

Sur le code derrière vous pouvez créer la méthode comme suit

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

Chaque fois que j'ai besoin de gérer des conditions dans un contrôle databound, j'utilise l'événement ItemDataBound .

Alors tu pourrais faire:

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

}
1
Jack Marchetti

Nous aurions besoin de voir le reste de votre code, mais le message d'erreur me donne un indice. Vous ne pouvez utiliser Eval que lorsque vous êtes à l'intérieur d'un contrôle lié aux données. Quelque chose comme un répéteur, une grille de données, etc.

Si vous êtes en dehors d'un contrôle lié aux données, vous pouvez charger la valeur dans une variable du code-behind et la rendre publique. Ensuite, vous pouvez l’utiliser sur l’ASPX pour le traitement conditionnel.

0
Mitchel Sellers

Pour FormView Control, reportez-vous à ce lien .

Voici l exemple de code. Mon page aspx FormView Control ressemble à ce qui suit:

<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>

Je vérifie la valeur pour <%# eval("PreviousDegreeYN") %>

Si ma eval("PreviousDegreeYN") == True, je souhaite afficher Yes dans mon libellé "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";

    }
}
0
vejee

Mettre une page aspx conditionnelle n’est pas une bonne idée.aussi désordonné . U peut le faire à l’aide de l’opérateur ternaire.Mais je vous conseille d’utiliser des événements rowdatabound de la vue en grille . Étape 1-aller aux propriétés de la vue grille.Cliquez sur l’éclairage bouton pour lister tous les événements. Étape 2: donnez un nom à rowdatabound et double-cliquez 

onid void onrow (expéditeur d'objet, 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";
        }
    }
}
0