Может ли кто-нибудь показать мне абсолютно минимальный код ASP.NET для понимания Eval()
и Bind()
?Понимание ASP.NET Eval() and Bind()
Лучше всего, если вы предоставите мне два отдельных фрагмента кода или можете быть веб-ссылками.
Может ли кто-нибудь показать мне абсолютно минимальный код ASP.NET для понимания Eval()
и Bind()
?Понимание ASP.NET Eval() and Bind()
Лучше всего, если вы предоставите мне два отдельных фрагмента кода или можете быть веб-ссылками.
Для контроля только для чтения они одинаковы. Для двухсторонней привязки данных, используя источник данных, в который вы хотите обновить, вставить и т. Д. С декларативной привязкой к данным, вам нужно будет использовать 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
является сильно тип объекта (от модели 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:
Источник: от this замечательной книги
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
Пожалуйста, подумайте о том, чтобы включить объяснение того, что делает ваш код. Хотя код может решить проблему, ответы на основе кода, как правило, не очень полезны для широкой общественности. – Antimony
GridView - это сложный элемент управления. Можете ли вы объяснить мне это проще с помощью простых элементов управления, таких как текстовое поле или сама страница? – anonymous
Я работаю с gridView. Но просто делаю это, запоминая. – anonymous
Упрощенные элементы управления не имеют свойства DataSource. –