Freigeben über


IBindableTemplate Schnittstelle

Definition

Ermöglicht datengebundenen ASP.NET-Steuerelementen, z. B. DetailsView und FormView, automatische Bindungen an ein ASP.NET-Datenquellensteuerelement in auf Vorlagen basierenden Inhaltsabschnitten.

public interface class IBindableTemplate : System::Web::UI::ITemplate
public interface IBindableTemplate : System.Web.UI.ITemplate
type IBindableTemplate = interface
    interface ITemplate
Public Interface IBindableTemplate
Implements ITemplate
Abgeleitet
Implementiert

Beispiele

Im folgenden Codebeispiel wird veranschaulicht, wie ein FormView Steuerelement inhalte mit Vorlagen deklarativ definieren, an von einem SqlDataSource Steuerelement bereitgestellte Daten binden und vorhandene Datensätze anzeigen und bearbeiten kann. Der ASP.NET parser analysiert den Inhalt der Vorlagen und erstellt zur Laufzeit ein IBindableTemplate Objekt, das Werte aus dem Steuerelement an die SqlDataSource datenbindungsbezogenen Bereiche binden kann, die in der Vorlage sowohl durch unidirektionale ASP.NET Datenbindungssyntax (<%# Eval("fieldname") %>) als auch durch bidirektionale Datenbindungssyntax (<%# Bind("fieldname") %>) definiert sind.

Wichtig

Dieses Steuerelement verfügt über ein Textfeld, das Benutzereingaben akzeptiert, was eine potenzielle Sicherheitsgefährdung darstellt. Standardmäßig stellen ASP.NET-Webseiten sicher, dass Benutzereingaben keine Skript- oder HTML-Elemente enthalten. Weitere Informationen finden Sie unter Übersicht über Skriptangriffe.


<%@ Page language="C#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">

  void EmployeeFormView_ItemUpdating(Object sender, FormViewUpdateEventArgs e)
  {

    // Validate the field values entered by the user. This
    // example determines whether the user left any fields
    // empty. Use the NewValues property to access the new 
    // values entered by the user.
    ArrayList emptyFieldList = ValidateFields(e.NewValues);

    if (emptyFieldList.Count > 0)
    {

      // The user left some fields empty. Display an error message.
      
      // Use the Keys property to retrieve the key field value.
      String keyValue = e.Keys["EmployeeID"].ToString();

      MessageLabel.Text = "You must enter a value for each field of record " +
        keyValue + ".<br/>The following fields are missing:<br/><br/>";

      // Display the missing fields.
      foreach (String value in emptyFieldList)
      {
        // Use the OldValues property to access the original value
        // of a field.
        MessageLabel.Text += value + " - Original Value = " + 
          e.OldValues[value].ToString() + "<br />";
      }

      // Cancel the update operation.
      e.Cancel = true;

    }
    else
    {
      // The field values passed validation. Clear the
      // error message label.
      MessageLabel.Text = "";
    }

  }

  ArrayList ValidateFields(IOrderedDictionary list)
  {
    
    // Create an ArrayList object to store the
    // names of any empty fields.
    ArrayList emptyFieldList = new ArrayList();

    // Iterate though the field values entered by
    // the user and check for an empty field. Empty
    // fields contain a null value.
    foreach (DictionaryEntry entry in list)
    {
      if (entry.Value == String.Empty)
      {
        // Add the field name to the ArrayList object.
        emptyFieldList.Add(entry.Key.ToString());
      }
    }

    return emptyFieldList;
  }

  void EmployeeFormView_ModeChanging(Object sender, FormViewModeEventArgs e)
  {
    if (e.CancelingEdit)
    {
      // The user canceled the update operation.
      // Clear the error message label.
      MessageLabel.Text = "";
    }
  }

</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
  <head runat="server">
    <title>FormView Example</title>
</head>
<body>
    <form id="form1" runat="server">
        
      <h3>FormView Example</h3>
                       
      <asp:formview id="EmployeeFormView"
        datasourceid="EmployeeSource"
        allowpaging="true"
        datakeynames="EmployeeID"
        headertext="Employee Record"
        emptydatatext="No employees found."
        onitemupdating="EmployeeFormView_ItemUpdating"
        onmodechanging="EmployeeFormView_ModeChanging"  
        runat="server">
        
        <headerstyle backcolor="CornFlowerBlue"
          forecolor="White"
          font-size="14"
          horizontalalign="Center"  
          wrap="false"/>
        <rowstyle backcolor="LightBlue"
          wrap="false"/>
        <pagerstyle backcolor="CornFlowerBlue"/>

        <itemtemplate>
          <table>
            <tr>
              <td rowspan="6">
                <asp:image id="EmployeeImage"
                  imageurl='<%# Eval("PhotoPath") %>'
                  alternatetext='<%# Eval("LastName") %>' 
                  runat="server"/>
              </td>
              <td colspan="2">
                    
              </td>
            </tr>
            <tr>
              <td>
                <b>Name:</b>
              </td>
              <td>
                <%# Eval("FirstName") %> <%# Eval("LastName") %>
              </td>
            </tr>
            <tr>
              <td>
                <b>Title:</b>
              </td>
              <td>
                <%# Eval("Title") %>
              </td>
            </tr>
            <tr>
              <td>
                <b>Hire Date:</b>                 
              </td>
              <td>
                <%# Eval("HireDate","{0:d}") %>
              </td>
            </tr>
            <tr style="height:150; vertical-align:top">
              <td>
                <b>Address:</b>
              </td>
              <td>
                <%# Eval("Address") %><br/>
                <%# Eval("City") %> <%# Eval("Region") %>
                <%# Eval("PostalCode") %><br/>
                <%# Eval("Country") %>   
              </td>
            </tr>
            <tr>
              <td colspan="2">
                <asp:linkbutton id="Edit"
                  text="Edit"
                  commandname="Edit"
                  runat="server"/> 
              </td>
            </tr>
          </table>       
        </itemtemplate>
        <edititemtemplate>
          <table>
            <tr>
              <td rowspan="6">
                <asp:image id="EmployeeEditImage"
                  imageurl='<%# Eval("PhotoPath") %>'
                  alternatetext='<%# Eval("LastName") %>' 
                  runat="server"/>
              </td>
              <td colspan="2">
                    
              </td>
            </tr>
            <tr>
              <td>
                <b>Name:</b>
              </td>
              <td>
                <asp:textbox id="FirstNameUpdateTextBox"
                  text='<%# Bind("FirstName") %>'
                  runat="server"/>
                <asp:textbox id="LastNameUpdateTextBox"
                  text='<%# Bind("LastName") %>'
                  runat="server"/>
              </td>
            </tr>
            <tr>
              <td>
                <b>Title:</b>
              </td>
              <td>
                <asp:textbox id="TitleUpdateTextBox"
                  text='<%# Bind("Title") %>'
                  runat="server"/> 
              </td>
            </tr>
            <tr>
              <td>
                <b>Hire Date:</b>                 
              </td>
              <td>
                <asp:textbox id="HireDateUpdateTextBox"
                  text='<%# Bind("HireDate", "{0:d}") %>'
                  runat="server"/>
              </td>
            </tr>
            <tr style="height:150; vertical-align:top">
              <td>
                <b>Address:</b>
              </td>
              <td>
                <asp:textbox id="AddressUpdateTextBox"
                  text='<%# Bind("Address") %>'
                  runat="server"/>
                <br/>
                <asp:textbox id="CityUpdateTextBox"
                  text='<%# Bind("City") %>'
                  runat="server"/> 
                <asp:textbox id="RegionUpdateTextBox"
                  text='<%# Bind("Region") %>'
                  width="40"
                  runat="server"/>
                <asp:textbox id="PostalCodeUpdateTextBox"
                  text='<%# Bind("PostalCode") %>'
                  width="60"
                  runat="server"/>
                <br/>
                <asp:textbox id="CountryUpdateTextBox"
                  text='<%# Bind("Country") %>'
                  runat="server"/> 
              </td>
            </tr>
            <tr>
              <td colspan="2">
                <asp:linkbutton id="UpdateButton"
                  text="Update"
                  commandname="Update"
                  runat="server"/>
                <asp:linkbutton id="CancelButton"
                  text="Cancel"
                  commandname="Cancel"
                  runat="server"/> 
              </td>
            </tr>
          </table>       
        </edititemtemplate>
          
        <pagersettings position="Bottom"
          mode="Numeric"/> 
                  
      </asp:formview>
      
      <br/><br/>
      
      <asp:label id="MessageLabel"
          forecolor="Red"
          runat="server"/>
          
      <!-- This example uses Microsoft SQL Server and connects  -->
      <!-- to the Northwind sample database. Use an ASP.NET     -->
      <!-- expression to retrieve the connection string value   -->
      <!-- from the Web.config file.                            -->
      <asp:sqldatasource id="EmployeeSource"
        selectcommand="Select [EmployeeID], [LastName], [FirstName], [Title], [Address], [City], [Region], [PostalCode], [Country], [HireDate], [PhotoPath] From [Employees]"
        updatecommand="Update [Employees] Set [LastName]=@LastName, [FirstName]=@FirstName, [Title]=@Title, [Address]=@Address, [City]=@City, [Region]=@Region, [PostalCode]=@PostalCode, [Country]=@Country Where [EmployeeID]=@EmployeeID"
        connectionstring="<%$ ConnectionStrings:NorthWindConnectionString%>" 
        runat="server"/>
            
    </form>
  </body>
</html>

<%@ Page language="VB" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">

  Sub EmployeeFormView_ItemUpdating(ByVal sender As Object, ByVal e As FormViewUpdateEventArgs) Handles EmployeeFormView.ItemUpdating
  
    ' Validate the field values entered by the user. This
    ' example determines whether the user left any fields
    ' empty. Use the NewValues property to access the new 
    ' values entered by the user.
        Dim emptyFieldList As ArrayList = ValidateFields(e.NewValues)

    If emptyFieldList.Count > 0 Then

      ' The user left some fields empty. Display an error message.
      
      ' Use the Keys property to retrieve the key field value.
      Dim keyValue As String = e.Keys("EmployeeID").ToString()

      MessageLabel.Text = "You must enter a value for each field of record " & _
        keyValue & ".<br/>The following fields are missing:<br/><br/>"

      ' Display the missing fields.
      Dim value As String
      For Each value In emptyFieldList
      
        ' Use the OldValues property to access the original value
        ' of a field.
        MessageLabel.Text &= value & " - Original Value = " & _
          e.OldValues(value).ToString() & "<br />"
        
      Next

      ' Cancel the update operation.
      e.Cancel = True

    Else
    
      ' The field values passed validation. Clear the
      ' error message label.
      MessageLabel.Text = ""
      
    End If

  End Sub

  Function ValidateFields(ByVal list As IOrderedDictionary) As ArrayList
    
    ' Create an ArrayList object to store the
    ' names of any empty fields.
    Dim emptyFieldList As New ArrayList()

    ' Iterate though the field values entered by
    ' the user and check for an empty field. Empty
    ' fields contain a null value.
    Dim entry As DictionaryEntry
    
    For Each entry In list
    
      If entry.Value Is String.Empty Then
      
        ' Add the field name to the ArrayList object.
        emptyFieldList.Add(entry.Key.ToString())
        
      End If
      
    Next

    Return emptyFieldList
  
  End Function
  
  Sub EmployeeFormView_ModeChanging(ByVal sender As Object, ByVal e As FormViewModeEventArgs) Handles EmployeeFormView.ModeChanging
  
    If e.CancelingEdit Then
      
      ' The user canceled the update operation.
      ' Clear the error message label.
      MessageLabel.Text = ""
    
    End If
    
  End Sub
  
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
  <head runat="server">
    <title>FormView Example</title>
</head>
<body>
    <form id="form1" runat="server">
        
      <h3>FormView Example</h3>
                       
      <asp:formview id="EmployeeFormView"
        datasourceid="EmployeeSource"
        allowpaging="true"
        datakeynames="EmployeeID"
        headertext="Employee Record"
        emptydatatext="No employees found."
        runat="server">
        
        <headerstyle backcolor="CornFlowerBlue"
          forecolor="White"
          font-size="14"
          horizontalalign="Center"  
          wrap="false"/>
        <rowstyle backcolor="LightBlue"
          wrap="false"/>
        <pagerstyle backcolor="CornFlowerBlue"/>

        <itemtemplate>
          <table>
            <tr>
              <td rowspan="6">
                <asp:image id="EmployeeImage"
                  imageurl='<%# Eval("PhotoPath") %>'
                  alternatetext='<%# Eval("LastName") %>' 
                  runat="server"/>
              </td>
              <td colspan="2">
                    
              </td>
            </tr>
            <tr>
              <td>
                <b>Name:</b>
              </td>
              <td>
                <%# Eval("FirstName") %> <%# Eval("LastName") %>
              </td>
            </tr>
            <tr>
              <td>
                <b>Title:</b>
              </td>
              <td>
                <%# Eval("Title") %>
              </td>
            </tr>
            <tr>
              <td>
                <b>Hire Date:</b>                 
              </td>
              <td>
                <%# Eval("HireDate","{0:d}") %>
              </td>
            </tr>
            <tr style="height:150; vertical-align:top">
              <td>
                <b>Address:</b>
              </td>
              <td>
                <%# Eval("Address") %><br/>
                <%# Eval("City") %> <%# Eval("Region") %>
                <%# Eval("PostalCode") %><br/>
                <%# Eval("Country") %>   
              </td>
            </tr>
            <tr>
              <td colspan="2">
                <asp:linkbutton id="Edit"
                  text="Edit"
                  commandname="Edit"
                  runat="server"/> 
              </td>
            </tr>
          </table>       
        </itemtemplate>
        <edititemtemplate>
          <table>
            <tr>
              <td rowspan="6">
                <asp:image id="EmployeeEditImage"
                  imageurl='<%# Eval("PhotoPath") %>'
                  alternatetext='<%# Eval("LastName") %>' 
                  runat="server"/>
              </td>
              <td colspan="2">
                    
              </td>
            </tr>
            <tr>
              <td>
                <b>Name:</b>
              </td>
              <td>
                <asp:textbox id="FirstNameUpdateTextBox"
                  text='<%# Bind("FirstName") %>'
                  runat="server"/>
                <asp:textbox id="LastNameUpdateTextBox"
                  text='<%# Bind("LastName") %>'
                  runat="server"/>
              </td>
            </tr>
            <tr>
              <td>
                <b>Title:</b>
              </td>
              <td>
                <asp:textbox id="TitleUpdateTextBox"
                  text='<%# Bind("Title") %>'
                  runat="server"/> 
              </td>
            </tr>
            <tr>
              <td>
                <b>Hire Date:</b>                 
              </td>
              <td>
                <asp:textbox id="HireDateUpdateTextBox"
                  text='<%# Bind("HireDate", "{0:d}") %>'
                  runat="server"/>
              </td>
            </tr>
            <tr style="height:150; vertical-align:top">
              <td>
                <b>Address:</b>
              </td>
              <td>
                <asp:textbox id="AddressUpdateTextBox"
                  text='<%# Bind("Address") %>'
                  runat="server"/>
                <br/>
                <asp:textbox id="CityUpdateTextBox"
                  text='<%# Bind("City") %>'
                  runat="server"/> 
                <asp:textbox id="RegionUpdateTextBox"
                  text='<%# Bind("Region") %>'
                  width="40"
                  runat="server"/>
                <asp:textbox id="PostalCodeUpdateTextBox"
                  text='<%# Bind("PostalCode") %>'
                  width="60"
                  runat="server"/>
                <br/>
                <asp:textbox id="CountryUpdateTextBox"
                  text='<%# Bind("Country") %>'
                  runat="server"/> 
              </td>
            </tr>
            <tr>
              <td colspan="2">
                <asp:linkbutton id="UpdateButton"
                  text="Update"
                  commandname="Update"
                  runat="server"/>
                <asp:linkbutton id="CancelButton"
                  text="Cancel"
                  commandname="Cancel"
                  runat="server"/> 
              </td>
            </tr>
          </table>       
        </edititemtemplate>
          
        <pagersettings position="Bottom"
          mode="Numeric"/> 
                  
      </asp:formview>
      
      <br/><br/>
      
      <asp:label id="MessageLabel"
          forecolor="Red"
          runat="server"/>
          
      <!-- This example uses Microsoft SQL Server and connects  -->
      <!-- to the Northwind sample database. Use an ASP.NET     -->
      <!-- expression to retrieve the connection string value   -->
      <!-- from the Web.config file.                            -->
      <asp:sqldatasource id="EmployeeSource"
        selectcommand="Select [EmployeeID], [LastName], [FirstName], [Title], [Address], [City], [Region], [PostalCode], [Country], [HireDate], [PhotoPath] From [Employees]"
        updatecommand="Update [Employees] Set [LastName]=@LastName, [FirstName]=@FirstName, [Title]=@Title, [Address]=@Address, [City]=@City, [Region]=@Region, [PostalCode]=@PostalCode, [Country]=@Country Where [EmployeeID]=@EmployeeID"
        connectionstring="<%$ ConnectionStrings:NorthWindConnectionString%>" 
        runat="server"/>
            
    </form>
  </body>
</html>

Hinweise

Die IBindableTemplate -Schnittstelle bietet eine Möglichkeit für ASP.NET datengebundenen Steuerelementen, z DetailsView. B. , GridViewund FormView, an Daten zu binden, die von einem ASP.NET Datenquellensteuerelement bereitgestellt werden, z ObjectDataSource . B. oder SqlDataSource, wenn das datengebundene Steuerelement inhalte in Vorlagen enthält.

Hinweis

Seitenentwickler implementieren die IBindableTemplate Schnittstelle nicht. Entwickler, die benutzerdefinierte datengebundene Steuerelemente erstellen, können Objekte in Implementierungen der PerformDataBinding Methoden und ExtractRowValues bearbeitenIBindableTemplate, implementieren jedoch keine eigenen IBindableTemplate Objekte.

Datengebundene Steuerelemente wie GridView kennen in der Regel ihre untergeordneten Steuerelementstrukturen und können daher Werte an sie binden, Werte daraus extrahieren und diese Werte bei jeder Datenbindung zwischen dem datengebundenen Steuerelement und einem Datenquellensteuerelement übergeben. Wenn ein Seitenentwickler jedoch vorlagenbasierte Inhalte für ein datengebundenes Steuerelement definiert, sind die untergeordneten Steuerelemente innerhalb der Vorlage für das übergeordnete datengebundene Steuerelement nicht sichtbar: Das übergeordnete Steuerelement kann den untergeordneten Inhalt rendern (da Steuerelemente sich effektiv selbst rendern), aber es kann nicht die Werte dieser untergeordneten Steuerelemente extrahieren, die an das Update eines zugeordneten Datenquellensteuerelements übergeben werden. Insert- oder Delete-Vorgang. In Datenbindungsszenarien sind vorlagenbasierte Inhalte für ein übergeordnetes datengebundenes Steuerelement undurchsichtig. Die Bind Syntax ermöglicht es dem datengebundenen Steuerelement, die Werte aus einem datengebundenen Steuerelement innerhalb einer IBindableTemplate Instanz zu extrahieren.

Die Datenbindung kann unidirektionale oder bidirektionale Datenbindung sein. (Diese Bindungsrichtungen werden durch die BindingDirection -Enumeration definiert.) Unidirektionale Datenbindung ist jede Datenbindung, die in ausgehender Richtung ausgeführt wird, von der Datenquellensteuerung bis zum datengebundenen Steuerelement. Beispielsweise umfasst jedes Datenleseszenario eine unidirektionale Datenbindung. Für die unidirektionale Datenbindung können Sie unidirektionale Datenbindungssyntax (<%# Eval("fieldname") %>) innerhalb von vorlagenbasierten Inhalten verwenden und müssen keine bidirektionale ASP.NET Datenbindungssyntax verwenden. Die bidirektionale Datenbindung beschreibt die Datenbindung in eingehender Richtung, vom datengebundenen Steuerelement bis zum Datenquellensteuerelement. Szenarien für automatisches Bearbeiten, Einfügen und Löschen mit ASP.NET datengebundenen Steuerelementen und Datenquellensteuerelementen sind bidirektionale Datenbindungsszenarien. In diesen Szenarien werden bidirektionale Datenbindungsausdrücke (<%# Bind("fieldname") %>) verwendet. Die IBindableTemplate Schnittstelle und die ASP.NET-Infrastruktur unterstützen die automatische, deklarative, bidirektionale Datenbindung zwischen ASP.NET Datenquellensteuerelementen und vorlagenbasierten Inhalten. Weitere Informationen zu ASP.NET Datenbindungsausdrücken und Syntax finden Sie unter Bindung an Datenbanken und Datenbindungsausdrücke – Übersicht.

Vorlageninhalte für datengebundene Steuerelemente werden am häufigsten deklarativ definiert. In der folgenden Tabelle werden die Prozesse beschrieben, die am häufigsten zum Binden von Vorlagendaten an datengebundene Steuerelemente verwendet werden.

Datengebundenes Steuerelement Prozess
DetailsView Das datengebundene Steuerelement wird mithilfe der DataSourceID -Eigenschaft des Datenquellensteuerelements an Daten gebunden, und der in Vorlagen enthaltene Inhalt wird in einer ItemTemplate- EditItemTemplate oder InsertItemTemplate -Eigenschaft definiert.
GridView Das datengebundene Steuerelement wird mithilfe der DataSourceID -Eigenschaft des Datenquellensteuerelements an Daten gebunden, und der in Vorlagen enthaltene Inhalt wird in einer ItemTemplate - oder EditItemTemplate -Eigenschaft definiert. Das GridView -Steuerelement unterstützt keinen Einfügevorgang.
FormView Das datengebundene Steuerelement wird mithilfe der DataSourceID -Eigenschaft an Daten gebunden, und der in Vorlagen enthaltene Inhalt wird in einer ItemTemplate- , InsertItemTemplate- oder EditItemTemplate -Eigenschaft oder in einem TemplateField -Objekt definiert.

Die DataList Steuerelemente und Repeater unterstützen keine automatischen bidirektionalen Datenbindungsszenarien.

ASP.NET erstellt implizit ein IBindableTemplate -Objekt, wenn vorlagenbezogene Inhalte, die an ein ASP.NET Datenquellensteuerelement innerhalb der Vorlage gebunden sind, analysiert werden. Insbesondere erstellt der ASP.NET Parser eine Instanz der CompiledBindableTemplateBuilder -Klasse, wenn er vorlagenbasierte Inhalte analysiert, die ASP.NET Datenbindungssyntax verwendet und ASP.NET Webserversteuerelemente enthält, die die Datenbindung unterstützen. Diese ASP.NET-Serversteuerelemente werden durch das BindableAttribute -Attribut gekennzeichnet.

Die IBindableTemplate -Schnittstelle definiert eine Methode, ExtractValues. Diese Methode ist für die bidirektionale Datenbindung definiert, sodass ein datengebundenes Steuerelement Automatisch Name-Wert-Paare aus Vorlageninhalten extrahieren und die Paare zur Laufzeit an ein Datenquellensteuerelement übergeben kann. Damit die automatische Datenbindung erfolgreich ist, müssen die Feldnamen, die von der -Methode aus dem vorlagenbasierten Inhalt extrahiert wurden, ExtractValues mit Parameternamen in einem zugeordneten Datenquellensteuerelement übereinstimmen. Steuerungsentwickler rufen die ExtractValues -Methode explizit nur innerhalb ihrer Implementierungen von ExtractRowValues oder einer anderen ähnlichen Methode eines benutzerdefinierten datengebundenen Steuerelements auf.

Methoden

ExtractValues(Control)

Ruft beim Implementieren durch eine Klasse eine Gruppe von Name-Wert-Paaren für Werte ab, die im auf Vorlagen basierenden Inhalt mithilfe der Syntax für bidirektionale ASP.NET-Datenbindung gebunden wurden.

InstantiateIn(Control)

Definiert bei der Implementierung durch eine Klasse das Control-Objekt, zu dem untergeordnete Steuerelemente und Vorlagen gehören. Diese untergeordneten Steuerelemente wiederum werden innerhalb einer Inlinevorlage definiert.

(Geerbt von ITemplate)

Gilt für:

Weitere Informationen