2009-11-22 6 views
47

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

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

ответ

70

Для контроля только для чтения они одинаковы. Для двухсторонней привязки данных, используя источник данных, в который вы хотите обновить, вставить и т. Д. С декларативной привязкой к данным, вам нужно будет использовать Bind.

Представьте себе, например, GridView с ItemTemplate и EditItemTemplate. Если вы используете Bind или Eval в ItemTemplate, не будет никакой разницы. Если вы используете Eval в EditItemTemplate, значение не может быть передано методу UpdateDataSource, к которому привязана сетка.


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 
    } 
} 
+1

GridView - это сложный элемент управления. Можете ли вы объяснить мне это проще с помощью простых элементов управления, таких как текстовое поле или сама страница? – anonymous

+0

Я работаю с gridView. Но просто делаю это, запоминая. – anonymous

+1

Упрощенные элементы управления не имеют свойства DataSource. –

15

Вопрос был отлично ответил Дарин Димитров, но с 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:

  • Intell iSense может найти правильное свойство объекта, работающий с вы как раз enter image description here
  • Если свойство переименовываются/удален, вы правильно получить ошибку перед просмотром страницы в браузере
  • Внешних инструментов (требуют полной версии VS) будете переименовать элемент в разметке при переименовании свойства вашего объекта

Источник: от this замечательной книги

+2

Как синтаксис '<% #' сравнивается с '<% =' то? – Dai

+0

[Это] (https://blogs.msdn.microsoft.com/dancre/2007/02/13/the-difference-between-and-in-asp-net/) объясняет разницу '<% #' и '<% ='. – LeoD3

-1
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

+1

Пожалуйста, подумайте о том, чтобы включить объяснение того, что делает ваш код. Хотя код может решить проблему, ответы на основе кода, как правило, не очень полезны для широкой общественности. – Antimony