web-dev-qa-db-ja.com

ASP.NET Eval()およびBind()を理解する

Eval()Bind()を理解するために、絶対に最小限のASP.NETコードを見せてもらえますか?

2つの別個のコードスニペットを提供するか、Webリンクである可能性があります。

52
user366312

読み取り専用コントロールの場合、それらは同じです。双方向のデータバインディングでは、宣言的なデータバインディングで更新、挿入などを行うデータソースを使用して、Bindを使用する必要があります。

たとえば、ItemTemplateEditItemTemplateを含むGridViewを想像してください。 BindEvalまたはItemTemplateを使用する場合、違いはありません。 EvalEditItemTemplateを使用すると、グリッドがバインドされているUpdateDataSourceメソッドに値を渡すことができません。 。


更新:私はこの例を思いついた:

<%@ 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
    }
}
75
Darin Dimitrov

質問はDarin Dimitrovによって完全に回答されましたが、ASP.NET 4.5以降、これらのバインディングを置き換えて設定するより良い方法があります* Eval()およびBind()厳密に型指定されたバインディングを利用します。

*注:これは、notを使用している場合にのみ機能しますSqlDataSourceまたはanonymous object。厳密に型指定されたオブジェクト(EFモデルまたはその他のクラス)が必要です。

このコードスニペットは、EvalおよびBindListViewコントロールにどのように使用されるかを示しています(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 %>

評価とバインドの利点

  • IntelliSenseは、操作しているオブジェクトの正しいプロパティを見つけることができます enter image description here
  • プロパティの名前を変更または削除すると、ブラウザでページが表示される前にエラーが発生します
  • オブジェクトのプロパティの名前を変更すると、外部ツール(VSのフルバージョンが必要)がマークアップのアイテムの名前を正しく変更します

ソース:from this excellent book

21
benscabbia