Может ли кто-нибудь показать мне абсолютно минимальный код ASP.NET, чтобы понять Eval() и Bind()?
Лучше всего, если вы предоставите мне два отдельных фрагмента кода или можете быть веб-ссылками.
Может ли кто-нибудь показать мне абсолютно минимальный код ASP.NET, чтобы понять Eval() и Bind()?
Лучше всего, если вы предоставите мне два отдельных фрагмента кода или можете быть веб-ссылками.
Для элементов управления только для чтения они одинаковы. Для двухсторонней привязки данных, используя источник данных, в который вы хотите обновить, вставить и т.д. С декларативной привязкой данных, вам нужно использовать 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
}
}
Ответ был полностью отреагирован Дарином Димитровым, но поскольку 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:
Источник: от эта отличная книга
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