web-dev-qa-db-fra.com

Comprendre ASP.NET Eval () et Bind ()

Quelqu'un peut-il me montrer du code ASP.NET absolument minimal pour comprendre Eval() et Bind()?

Il est préférable que vous me fournissiez deux extraits de code distincts ou qu'il s'agisse de liens Web.

52
user366312

Pour les contrôles en lecture seule, ils sont identiques. Pour la liaison de données bidirectionnelle, en utilisant une source de données dans laquelle vous souhaitez mettre à jour, insérer, etc. avec une liaison de données déclarative, vous devrez utiliser Bind.

Imaginez par exemple un GridView avec un ItemTemplate et EditItemTemplate. Si vous utilisez Bind ou Eval dans le ItemTemplate, il n'y aura pas de différence. Si vous utilisez Eval dans le EditItemTemplate, la valeur ne pourra pas être transmise à la méthode Update de la DataSource à laquelle la grille est liée .


MISE À JOUR: J'ai trouvé cet exemple:

<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Data binding demo</title>
</head>
<body>
    <form id="form1" runat="server">
        <asp:GridView 
            ID="grdTest" 
            runat="server" 
            AutoGenerateEditButton="true" 
            AutoGenerateColumns="false" 
            DataSourceID="mySource">
            <Columns>
                <asp:TemplateField>
                    <ItemTemplate>
                        <%# Eval("Name") %>
                    </ItemTemplate>
                    <EditItemTemplate>
                        <asp:TextBox 
                            ID="edtName" 
                            runat="server" 
                            Text='<%# Bind("Name") %>' 
                        />
                    </EditItemTemplate>
                </asp:TemplateField>
            </Columns>
        </asp:GridView>
    </form>

    <asp:ObjectDataSource 
        ID="mySource" 
        runat="server"
        SelectMethod="Select" 
        UpdateMethod="Update" 
        TypeName="MyCompany.CustomDataSource" />
</body>
</html>

Et voici la définition d'une classe personnalisée qui sert de source de données d'objet:

public class CustomDataSource
{
    public class Model
    {
        public string Name { get; set; }
    }

    public IEnumerable<Model> Select()
    {
        return new[] 
        {
            new Model { Name = "some value" }
        };
    }

    public void Update(string Name)
    {
        // This method will be called if you used Bind for the TextBox
        // and you will be able to get the new name and update the
        // data source accordingly
    }

    public void Update()
    {
        // This method will be called if you used Eval for the TextBox
        // and you will not be able to get the new name that the user
        // entered
    }
}
75
Darin Dimitrov

Darin Dimitrov a parfaitement répondu à la question, mais depuis ASP.NET 4.5 , il existe désormais un meilleur moyen de configurer ces liaisons pour remplacer * Eval() et Bind(), tirant parti des liaisons fortement typées .

* Remarque: cela ne fonctionnera que si vous n'utilisez pas un SqlDataSource ou un anonymous object. Il nécessite un objet fortement typé (à partir d'un modèle EF ou de toute autre classe).

Cet extrait de code montre comment Eval et Bind seraient utilisés pour un contrôle ListView (InsertItem a besoin Bind, comme expliqué par Darin Dimitrov ci-dessus, et ItemTemplate est en lecture seule (donc ce sont des étiquettes), il suffit donc d'un Eval):

<asp:ListView ID="ListView1" runat="server" DataKeyNames="Id" InsertItemPosition="LastItem" SelectMethod="ListView1_GetData" InsertMethod="ListView1_InsertItem" DeleteMethod="ListView1_DeleteItem">
    <InsertItemTemplate>
        <li>
            Title: <asp:TextBox ID="Title" runat="server" Text='<%# Bind("Title") %>'/><br />         
            Description: <asp:TextBox ID="Description" runat="server" TextMode="MultiLine" Text='<%# Bind("Description") %>' /><br />        
            <asp:Button ID="InsertButton" runat="server" Text="Insert" CommandName="Insert" />        
        </li>
    </InsertItemTemplate>
    <ItemTemplate>
        <li>
            Title: <asp:Label ID="Title" runat="server" Text='<%#  Eval("Title") %>' /><br />
            Description: <asp:Label ID="Description" runat="server" Text='<%# Eval("Description") %>' /><br />        
            <asp:Button ID="DeleteButton" runat="server" Text="Delete" CommandName="Delete" CausesValidation="false"/>
        </li>
      </ItemTemplate>

Depuis ASP.NET 4.5 + , les contrôles liés aux données ont été étendus avec une nouvelle propriété ItemType, qui pointe vers le type d'objet vous attribuez à sa source de données.

<asp:ListView ItemType="Picture" ID="ListView1" runat="server" ...>

Picture est l'objet fortement type (du modèle EF). Nous remplaçons ensuite:

Bind(property) -> BindItem.property
Eval(property) -> Item.property

Donc ça:

<%# Bind("Title") %>      
<%# Bind("Description") %>         
<%#  Eval("Title") %> 
<%# Eval("Description") %>

Deviendrait ceci:

<%# BindItem.Title %>         
<%# BindItem.Description %>
<%# Item.Title %>
<%# Item.Description %>

Avantages par rapport à Eval & Bind :

  • IntelliSense peut trouver la propriété correcte de l'objet avec lequel vous travaillez enter image description here
  • Si la propriété est renommée/supprimée, vous obtiendrez une erreur avant que la page ne soit affichée dans le navigateur
  • Les outils externes (nécessite des versions complètes de VS) renommeront correctement l'élément dans le balisage lorsque vous renommez une propriété sur votre objet

Source : de this excellent livre

21
benscabbia