Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

Для элементов управления только для чтения они одинаковы. Для двухсторонней привязки данных, используя источник данных, в который вы хотите обновить, вставить и т.д. С декларативной привязкой данных, вам нужно использовать 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
    }
}

Ответ 2

Ответ был полностью отреагирован Дарином Димитровым, но поскольку 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) будут правильно переименовывать элемент в разметке, когда вы переименуете свойство на свой объект

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

Ответ 3

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