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.
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
}
}
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 :
Source : de this excellent livre