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

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

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

3 ответов


для элементов управления только для чтения они одинаковы. Для 2 способа привязки данных, используя источник данных, в котором вы хотите обновить, вставить и т. д. с декларативной привязкой данных, вам нужно использовать Bind.

представьте себе, например, GridView с ItemTemplate и EditItemTemplate. Если вы используете Bind или Eval на ItemTemplate, разницы не будет никакой. Если вы используете Eval на EditItemTemplate значение не сможет быть передан Update метод DataSource что сетка привязана к.


UPDATE: я придумал этот пример:

<%@ 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
    }
}

на вопрос прекрасно ответил Дарин Димитров, но так как 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 является объектом strongly type (из модели 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 может найти правильное свойство объекта, с которым вы работаетеenter image description here
  • если свойство переименовано / удалено, вы получите сообщение об ошибке перед просмотром страницы в браузер
  • внешние инструменты (требуются полные версии VS) правильно переименуют элемент в разметке при переименовании свойства на вашем объекте

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


grdexcel.Visible = true;
            Response.ClearContent();
            Response.Buffer = true;
            Response.AddHeader("content-disposition", string.Format("attachment; filename={0}", "Registration.xls"));
            Response.ContentType = "application/ms-excel";
            StringWriter sw = new StringWriter();
            HtmlTextWriter htw = new HtmlTextWriter(sw);
            grdexcel.AllowPaging = false;
            Fill_Grid();

            HtmlForm htmf = new HtmlForm();
            htmf.Attributes.Add("runat", "server");

            htmf.Controls.Add(grdexcel);
            grdexcel.RenderControl(htw);
            Response.Write(sw.ToString());
            Response.End();
            grdexcel.Visible = false;

tihor