Compreensão ASP.NET Eval () e Bind ()
Bind()
?
é melhor se você me fornecer dois excertos de código separados ou pode ser web-links.
3 answers
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
}
}
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.
- 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
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