Esta documentación está archivada y no tiene mantenimiento.

IBindableTemplate (Interfaz)

Proporciona un medio para que los controles enlazados a datos de ASP.NET, como DetailsView y FormView, puedan enlazarse automáticamente a un control de origen de datos de ASP.NET dentro de las secciones de contenido con plantilla.

Espacio de nombres: System.Web.UI
Ensamblado: System.Web (en system.web.dll)

public interface IBindableTemplate : ITemplate
public interface IBindableTemplate extends ITemplate
public interface IBindableTemplate extends ITemplate
No aplicable.

La interfaz IBindableTemplate proporciona un medio para que los controles enlazados a datos de ASP.NET, como DetailsView, GridView y FormView, puedan enlazarse a los datos suministrados por un control de origen de datos de ASP.NET, como ObjectDataSource o SqlDataSource, cuando el control enlazado a datos incluye contenido con plantilla.

NotaNota:

Los desarrolladores de páginas no implementan la interfaz IBindableTemplate. Los desarrolladores que crean controles personalizados enlazados a datos podrían manipular objetos IBindableTemplate en implementaciones de los métodos PerformDataBinding y ExtractRowValues, pero no implementan sus propios objetos IBindableTemplate.

Los controles enlazados a datos, como GridView, suelen tener en cuenta sus árboles de controles secundarios y, por tanto, pueden enlazar valores a ellos, extraer valores de ellos y pasar estos valores entre el control enlazado a datos y un control de origen de datos cada vez que se produce el enlace. Sin embargo, cuando un desarrollador de páginas define el contenido con plantilla para un control enlazado a datos, los controles secundarios contenidos en la plantilla no son visibles para el control primario enlazado a datos: el control primario puede representar el contenido secundario (porque los controles pueden representarse de hecho a sí mismos), pero no puede extraer los valores de estos controles secundarios para pasarlos a una operación de actualización, inserción o eliminación de un control de origen de datos asociado. En escenarios de enlace de datos, el contenido con plantilla es opaco para un control enlazado a datos primario. La sintaxis Bind permite al control enlazado a datos extraer los valores de un control enlazado a datos que esté dentro de una instancia de IBindableTemplate.

El enlace de datos puede ser unidireccional o bidireccional (la enumeración BindingDirection es la que define estas direcciones de enlace). El enlace de datos unidireccional es cualquier enlace de datos realizado en una dirección de salida, del control de origen de datos al control enlazado a datos; por ejemplo, cualquier escenario de lectura de datos implica un enlace de datos unidireccional. Para realizar el enlace de datos unidireccional, puede utilizar la sintaxis de enlace de datos unidireccional (<%# Eval("fieldname") %>) dentro del contenido con plantilla; no necesita utilizar la sintaxis de enlace de datos bidireccional de ASP.NET. El enlace de datos bidireccional describe un enlace de datos en dirección entrante, del control enlazado a datos al control de origen de datos. Los escenarios de eliminación, inserción y edición automáticas que utilizan controles de origen de datos y controles enlazados a datos de ASP.NET son escenarios de enlace de datos bidireccional. Estos escenarios utilizan expresiones de enlace de datos bidireccional (<%# Bind("fieldname") %>). La interfaz IBindableTemplate y la infraestructura de ASP.NET admiten el enlace de datos automático, declarativo y bidireccional entre controles de origen de datos de ASP.NET y contenido con plantilla. Para obtener más información sobre las expresiones de enlace de datos de ASP.NET y su sintaxis, vea Establecer enlaces a bases de datos y Sintaxis de expresiones de enlace de datos.

El contenido con plantilla para controles enlazados a datos se suele definir mediante declaración. La tabla siguiente describe los procesos utilizados más habitualmente para enlazar datos con plantilla a controles enlazados a datos.

Control enlazado a datos

Proceso

DetailsView

El control enlazado a datos se enlaza a los datos utilizando la propiedad DataSourceID del control de origen de datos; por otro lado, el contenido con plantilla está definido en una propiedad ItemTemplate, EditItemTemplate o InsertItemTemplate.

GridView

El control enlazado a datos se enlaza a los datos utilizando la propiedad DataSourceID del control de origen de datos; por otro lado, el contenido con plantilla está definido en una propiedad ItemTemplate o EditItemTemplate. El control GridView no admite operaciones de inserción.

FormView

El control enlazado a datos se enlaza a los datos utilizando la propiedad DataSourceID; por otro lado, el contenido con plantilla está definido en una propiedad ItemTemplate, InsertItemTemplate o EditItemTemplate, o en un objeto TemplateField.

Los controles DataList y Repeater no admiten escenarios de enlace de datos bidireccional automático.

ASP.NET crea implícitamente un objeto IBindableTemplate cuando se analiza contenido con plantilla que se enlaza a un control de origen de datos de ASP.NET. En concreto, el analizador de ASP.NET crea una instancia de la clase CompiledBindableTemplateBuilder cuando analiza contenido con plantilla que utiliza la sintaxis de enlace de datos de ASP.NET y contiene controles de servidor Web de ASP.NET que admiten el enlace de datos. Estos controles de servidor de ASP.NET están marcados con el atributo BindableAttribute.

La interfaz IBindableTemplate define un método, ExtractValues. Este método se define para el enlace de datos bidireccional, de modo que un control enlazado a datos pueda extraer automáticamente, desde el contenido con plantilla, pares de nombre y valor, y pasar esos pares en tiempo de ejecución a un control de origen de datos. Para que el enlace de datos automático se realice correctamente, los nombres de campo extraídos del contenido con plantilla por el método ExtractValues deben coincidir con nombres de parámetro en un control de origen de datos asociado. Los desarrolladores de controles llaman explícitamente al método ExtractValues únicamente desde dentro de sus implementaciones de ExtractRowValues o desde algún otro método similar de un control enlazado a datos personalizado.

En el siguiente ejemplo de código, se muestra cómo un control FormView puede definir mediante declaración el contenido con plantilla, enlazarse a datos proporcionados por un control SqlDataSource y mostrar y editar los registros existentes. El analizador de ASP.NET analiza el contenido con plantilla y crea un objeto IBindableTemplate, en tiempo de ejecución, que puede enlazar valores procedentes del control SqlDataSource con las áreas de enlace de datos, definidas en la plantilla, mediante sintaxis de enlace de datos unidireccional de ASP.NET (<%# Eval("fieldname") %>) y sintaxis de enlace de datos bidireccional (<%# Bind("fieldname") %>).

Nota de seguridadNota: de seguridad

Este control tiene un cuadro de texto que acepta datos del usuario, lo que puede suponer una amenaza para la seguridad. De forma predeterminada, las páginas Web ASP.NET validan que los datos proporcionados por el usuario no incluyen elementos HTML ni de secuencia de comandos. Para obtener más información, vea Información general sobre los ataques mediante secuencias de comandos.


<%@ 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">
                  &nbsp; 
              </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">
                  &nbsp; 
              </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>


Windows 98, Windows 2000 Service Pack 4, Windows CE, Windows Millennium, Windows Mobile para Pocket PC, Windows Mobile para Smartphone, Windows Server 2003, Windows XP Media Center, Windows XP Professional x64, Windows XP SP2, Windows XP Starter

Microsoft .NET Framework 3.0 es compatible con Windows Vista, Microsoft Windows XP SP2 y Windows Server 2003 SP1.

.NET Framework

Compatible con: 3.0, 2.0
Mostrar: