Понимание ASP.NET Eval() и Bind()

Может ли кто-нибудь показать мне абсолютно минимальный код ASP.NET, чтобы понять Eval() и Bind()?

Лучше всего, если вы предоставите мне два отдельных фрагмента кода или веб-ссылки.


person user366312    schedule 22.11.2009    source источник


Ответы (2)


Для элементов управления только для чтения они одинаковы. Для двусторонней привязки данных с использованием источника данных, в который вы хотите обновить, вставить и т. д. с декларативной привязкой данных, вам нужно будет использовать 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
    }
}
person Darin Dimitrov    schedule 22.11.2009
comment
GridView — это сложный элемент управления. Можете ли вы объяснить мне это с помощью более простых элементов управления, таких как текстовое поле или сама страница? - person user366312; 22.11.2009
comment
Более простые элементы управления не имеют свойства DataSource. - person Darin Dimitrov; 22.11.2009
comment
@DarinDimitrov Bind или Eval работают только с IEnumerables? Могу ли я использовать это, если мой источник — DataTable? - person ghostJago; 04.11.2011

На этот вопрос прекрасно ответил Дарин Димитров, но, начиная с 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:

  • IntelliSense может найти правильное свойство объекта, с которым вы работаетевведите здесь описание изображения
  • Если свойство переименовано/удалено, вы получите сообщение об ошибке перед просмотром страницы в браузере
  • Внешние инструменты (требуются полные версии VS) будут правильно переименовывать элемент в разметке, когда вы переименовываете свойство своего объекта.

Источник: из эта отличная книга

person benscabbia    schedule 15.09.2015
comment
Как тогда синтаксис <%# соотносится с <%=? - person Dai; 12.02.2017
comment
Это объясняет разницу между <%# и <%=. - person LeoD3; 24.01.2018
comment
Как, черт возьми, я узнал об этой функции только сейчас?!? Блестящий - person breez; 11.06.2019