Может ли кто-нибудь показать мне абсолютно минимальный код ASP.NET, чтобы понять Eval()
и Bind()
?
Лучше всего, если вы предоставите мне два отдельных фрагмента кода или веб-ссылки.
Может ли кто-нибудь показать мне абсолютно минимальный код ASP.NET, чтобы понять Eval()
и Bind()
?
Лучше всего, если вы предоставите мне два отдельных фрагмента кода или веб-ссылки.
Для элементов управления только для чтения они одинаковы. Для двусторонней привязки данных с использованием источника данных, в который вы хотите обновить, вставить и т. д. с декларативной привязкой данных, вам нужно будет использовать Bind
.
Представьте, например, GridView с ItemTemplate
и EditItemTemplate
. Если вы используете Bind
или Eval
в ItemTemplate
, разницы не будет. Если вы используете Eval
в EditItemTemplate
, значение не сможет быть передано в метод Update
DataSource
, к которому привязана сетка.
ОБНОВЛЕНИЕ: я придумал этот пример:
<%@ 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>
А вот определение пользовательского класса, который служит источником данных объекта:
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
}
}
DataSource
.
- person Darin Dimitrov; 22.11.2009
На этот вопрос прекрасно ответил Дарин Димитров, но, начиная с ASP.NET 4.5, теперь есть лучший способ настроить эти привязки для замены* Eval()
и Bind()
, используя преимущество сильно- типизированные привязки.
*Примечание. это будет работать, только если вы не используете SqlDataSource
или anonymous object
. Для этого требуется строго типизированный объект (из модели EF или любого другого класса).
Этот фрагмент кода показывает, как Eval
и Bind
будут использоваться для элемента управления ListView
(для InsertItem
требуется Bind
, как объяснил Дарин Димитров выше, а ItemTemplate
доступен только для чтения (следовательно, это метки), поэтому нужен только 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>
Начиная с ASP.NET 4.5+, элементы управления с привязкой к данным были дополнены новым свойством ItemType
, которое указывает на тип объекта, который вы назначаете его источнику данных.
<asp:ListView ItemType="Picture" ID="ListView1" runat="server" ...>
Picture
— объект строгого типа (из модели EF). Затем заменяем:
Bind(property) -> BindItem.property
Eval(property) -> Item.property
Итак, это:
<%# Bind("Title") %>
<%# Bind("Description") %>
<%# Eval("Title") %>
<%# Eval("Description") %>
Стало бы так:
<%# BindItem.Title %>
<%# BindItem.Description %>
<%# Item.Title %>
<%# Item.Description %>
Преимущества перед Eval & Bind:
Источник: из эта отличная книга
<%#
соотносится с <%=
?
- person Dai; 12.02.2017