Compreensão ASP.NET Eval () e Bind ()

Alguém pode mostrar-me o mínimo possível? ASP.NET código para entender {[[0]} e Bind()?

é melhor se você me fornecer dois excertos de código separados ou pode ser web-links.

Author: famousgarkin, 2009-11-22

3 answers

Para os controlos apenas de leitura, são os mesmos. Para a base de dados 2 way, usando um datasource no qual você deseja atualizar, inserir, etc com a base de dados declarativa, você terá que usar Bind.

Imagine, por exemplo, uma grelha com um ItemTemplate e EditItemTemplate. Se utilizar Bind ou Eval no ItemTemplate, não haverá diferença. Se você usar Eval no EditItemTemplate, o valor não será capaz de ser passado para o método Update do DataSource ao qual a grade está ligada.


Actualização: apresente este exemplo:

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

E aqui está a definição de uma classe personalizada que serve como fonte de dados de objectos:

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
    }
}
 71
Author: Darin Dimitrov, 2009-11-22 10:15:42

A pergunta foi respondida perfeitamente por Darin Dimitrov, mas desde que ASP.NET 4.5, agora há uma melhor forma de configurar estas ligações, para substituir* Eval() e Bind(), aproveitando a fortemente tipados ligações.

*Nota: isto só funcionará se você não estivera usar um SqlDataSource ou um anonymous object. Ele requer um objeto fortemente tipado (a partir de um modelo EF ou qualquer outra classe).

Este excerto de código mostra como Eval e Bind seria usado para um controle ListView (InsertItem necessidades Bind, como explicado por Darin Dimitrov acima, e ItemTemplate é apenas de leitura (daí serem rótulos), então só precisa de um 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>

De ASP.NET 4.5+, Os controlos de dados foram alargados com uma nova propriedade ItemType, que aponta para o tipo de objecto que está a atribuir à sua fonte de dados.

<asp:ListView ItemType="Picture" ID="ListView1" runat="server" ...>

Picture é o objeto de tipo forte (do modelo EF). Em seguida, substituímos:

Bind(property) -> BindItem.property
Eval(property) -> Item.property
Então ... isto:
<%# Bind("Title") %>      
<%# Bind("Description") %>         
<%#  Eval("Title") %> 
<%# Eval("Description") %>

Tornar-se-ia isto:

<%# BindItem.Title %>         
<%# BindItem.Description %>
<%# Item.Title %>
<%# Item.Description %>

Vantagens sobre Eval & Bind:

    IntelliSense pode encontrar a propriedade correta do objeto com o qual você está trabalhando.enter image description here
  • se a propriedade for renomeada/apagada, irá obter um erro antes de a página ser vista no navegador
  • as ferramentas externas (necessita de versões completas do VS) irão mudar correctamente o nome do item na marcação quando mudar o nome de uma propriedade no seu objecto

Fonte : de este livro excelente

 17
Author: benscabbia, 2015-09-15 11:12:31
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

 -2
Author: user8977577, 2017-11-21 06:16:01