Condividi tramite


Cenni preliminari sulle espressioni di associazione dati

Aggiornamento: novembre 2007

La sintassi di associazione dati consente di associare ai dati i valori relativi alle proprietà dei controlli, nonché di specificare i valori per il recupero, l'aggiornamento, l'eliminazione e l'immissione di dati.

Sintassi di associazione dati

Le espressioni di associazione dati sono contenute all'interno dei delimitatori <%# e %> e utilizzano le funzioni Eval e Bind. La funzione Eval viene utilizzata per definire l'associazione a senso unico (di sola lettura). La funzione Bind viene utilizzata per definire l'associazione a doppio senso (aggiornabile). Oltre a chiamare i metodi Eval e Bind per eseguire l'associazione dati in un'espressione di associazione dati, è possibile chiamare qualsiasi codice con accesso pubblico contenuto all'interno dei delimitatori <%# e %> per eseguire tale codice e restituire un valore durante l'elaborazione della pagina.

Le espressioni di associazione dati vengono risolte chiamando il metodo DataBind di un controllo o della classe Page. Per controlli quali GridView, DetailsView e controlli FormView, le espressioni di associazione dati vengono risolte automaticamente durante l'evento PreRender del controllo, senza che sia necessario chiamare il metodo DataBind in modo esplicito.

Nell'esempio di codice riportato di seguito viene illustrato l'utilizzo delle espressioni di associazione dati con un controllo FormView in ItemTemplate.

<asp:FormView ID="FormView1"
  DataSourceID="SqlDataSource1"
  DataKeyNames="ProductID"     
  RunAt="server">

  <ItemTemplate>
    <table>
      <tr><td align="right"><b>Product ID:</b></td>       <td><%# Eval("ProductID") %></td></tr>
      <tr><td align="right"><b>Product Name:</b></td>     <td><%# Eval("ProductName") %></td></tr>
      <tr><td align="right"><b>Category ID:</b></td>      <td><%# Eval("CategoryID") %></td></tr>
      <tr><td align="right"><b>Quantity Per Unit:</b></td><td><%# Eval("QuantityPerUnit") %></td></tr>
      <tr><td align="right"><b>Unit Price:</b></td>       <td><%# Eval("UnitPrice") %></td></tr>
    </table>                 
  </ItemTemplate>                   
</asp:FormView>
<asp:FormView ID="FormView1"
  DataSourceID="SqlDataSource1"
  DataKeyNames="ProductID"     
  RunAt="server">

  <ItemTemplate>
    <table>
      <tr><td align="right"><b>Product ID:</b></td>       <td><%# Eval("ProductID") %></td></tr>
      <tr><td align="right"><b>Product Name:</b></td>     <td><%# Eval("ProductName") %></td></tr>
      <tr><td align="right"><b>Category ID:</b></td>      <td><%# Eval("CategoryID") %></td></tr>
      <tr><td align="right"><b>Quantity Per Unit:</b></td><td><%# Eval("QuantityPerUnit") %></td></tr>
      <tr><td align="right"><b>Unit Price:</b></td>       <td><%# Eval("UnitPrice") %></td></tr>
    </table>                 
  </ItemTemplate>                 
</asp:FormView>

Utilizzo del metodo Eval

Il metodo Eval valuta le espressioni di dati ad associazione tardiva nei modelli dei controlli associati a dati quali GridView, DetailsView e controlli FormView. In fase di esecuzione, il metodo Eval chiama il metodo Eval dell'oggetto DataBinder, facendo riferimento all'elemento dati corrente del contenitore di denominazione. Il contenitore di denominazione è in genere l'unità più piccola del controllo associato a dati e contiene un record intero, come, ad esempio, una riga in un controllo GridView. È possibile pertanto utilizzare il metodo Eval solo per effettuare associazioni all'interno di modelli di controlli associati a dati.

Il metodo Eval utilizza il nome di un campo dati e restituisce una stringa contenente il valore di tale campo dal record corrente nell'origine dati. È possibile fornire un secondo parametro facoltativo per specificare un formato per la stringa restituita. Il parametro di formato della stringa utilizza la sintassi definita per il metodo Format della classe String.

Utilizzo del metodo Bind

Il metodo Bind presenta alcune analogie con il metodo Eval, ma le differenze sono significative. Sebbene sia possibile recuperare i valori dei campi associati a dati utilizzando il metodo Bind, come accade per il metodo Eval, il metodo Bind viene anche utilizzato quando i dati possono essere modificati.

In ASP.NET, i controlli associati a dati quali GridView, DetailsView e i controlli FormView possono utilizzare automaticamente le operazioni di aggiornamento, eliminazione e inserimento di un controllo origine dati. Se, ad esempio, sono state definite le istruzioni SQL Select, Insert, Delete e Update per il controllo origine dati, utilizzando Bind in GridView, DetailsView o FormView, il modello del controllo consente al controllo di estrarre i valori dai controlli figlio nel modello e di passarli al controllo origine dati. Il controllo origine dati esegue a sua volta il comando appropriato per il database. Per questo motivo, la funzione Bind viene utilizzata all'interno di EditItemTemplate o di InsertItemTemplate di un controllo associato a dati.

Il metodo Bind viene generalmente utilizzato nei controlli di input, come il controllo TextBox, il cui rendering viene effettuato da una riga GridView in modalità di modifica. Quando il controllo associato a dati crea i controlli di input come parte del proprio rendering, è in grado di estrarre i valori di input.

Il metodo Bind utilizza il nome di un campo dati e lo associa alla rispettiva proprietà, come illustrato nell'esempio riportato di seguito.

Nota sulla sicurezza:

L'esempio include una casella di testo che accetta l'input dell'utente e rappresenta quindi una potenziale minaccia alla sicurezza. Per impostazione predefinita, le pagine Web ASP.NET verificano che l'input dell'utente non includa script o elementi HTML. Per ulteriori informazioni, vedere Cenni preliminari sugli attacchi tramite script.

<EditItemTemplate>
  <table>
    <tr>
      <td align=right>
        <b>Employee ID:</b>
      </td>
      <td>
        <%# Eval("EmployeeID") %>
      </td>
    </tr>
    <tr>
      <td align=right>
        <b>First Name:</b>
      </td>
      <td>
        <asp:TextBox ID="EditFirstNameTextBox" RunAt="Server"
          Text='<%# Bind("FirstName") %>' />
      </td>
    </tr>
    <tr>
      <td align=right>
        <b>Last Name:</b>
      </td>
      <td>
        <asp:TextBox ID="EditLastNameTextBox" RunAt="Server"
            Text='<%# Bind("LastName") %>'  />
      </td>
    </tr>
    <tr>
      <td colspan="2">
        <asp:LinkButton ID="UpdateButton" RunAt="server"
          Text="Update" CommandName="Update" />
        &nbsp;
        <asp:LinkButton ID="CancelUpdateButton" RunAt="server"
          Text="Cancel" CommandName="Cancel" />
      </td>
    </tr>
  </table>
</EditItemTemplate>

Quando si fa clic sul pulsante Update per la riga, i valori di ciascuna proprietà di un controllo associato tramite la sintassi Bind vengono estratti e passati al controllo origine dati per l'aggiornamento.

Chiamata al metodo DataBind in modo esplicito

I controlli GridView, FormView e i controlli DetailsView eseguono l'associazione chiamando il metodo DataBind in modo implicito nel caso siano associati a un controllo origine dati che utilizzi la proprietà DataSourceID. Tuttavia, in alcune situazioni è necessario chiamare il metodo DataBind in modo esplicito.

Ad esempio, quando un controllo è stato associato a un controllo origine dati utilizzando la proprietà DataSource anziché la proprietà DataSourceID. In questo caso, è necessario chiamare il metodo DataBind in modo esplicito per eseguire l'associazione dati e risolvere le espressioni di associazione dati.

Un altro caso è quello in cui occorre aggiornare manualmente i dati in un controllo associato a dati. Si consideri una pagina in cui sono presenti due controlli che visualizzano le informazioni dello stesso database, utilizzando probabilmente visualizzazioni diverse. In questo caso, potrebbe essere necessario associare nuovamente il controllo ai dati in modo esplicito per sincronizzare la visualizzazione dei dati. Ad esempio, è possibile avere un controllo GridView che visualizza un elenco di prodotti, e un controllo DetailsView che consente di modificare un singolo prodotto. Anche se visualizzano dati provenienti dalla stessa origine, i controlli GridView e DetailsView sono associati a controlli di origine dati differenti perché utilizzano query diverse per ottenere i rispettivi dati. È possibile aggiornare un record utilizzando il controllo DetailsView, in modo che l'aggiornamento venga eseguito dal controllo origine dati associato. Tuttavia, poiché è associato a un controllo origine dati diverso, il controllo GridView visualizzerà i valori di record precedenti finché la pagina non verrà aggiornata. Pertanto, dopo che il controllo DetailsView avrà effettuato l'aggiornamento dei dati, sarà possibile chiamare il metodo DataBind. Di conseguenza, il controllo GridView aggiornerà anche la propria visualizzazione eseguendo nuovamente le espressioni di associazione dati e il codice di accesso pubblico contenuto all'interno dei delimitatori <%# e %>. Al termine del processo, il controllo GridView rifletterà l'aggiornamento effettuato dal controllo DetailsView.

Utilizzo dell'associazione per una tabella di ricerca

I controlli con associazione a dati consentono agli utenti di aggiornare o inserire un valore selezionandolo in una tabella di ricerca mediante un controllo DropDownList o un altro controllo di elenco. In questo caso, il controllo di ricerca è associato a un'origine dati distinta che restituisce l'elenco dei valori possibili e il valore selezionato del controllo di ricerca è associato a un campo nella riga con associazione a dati padre.

È possibile aggiungere questa funzionalità come illustrato di seguito. Innanzitutto, per il controllo di ricerca aggiungere un controllo di elenco (un controllo DropDownList o ListBox) a un modello in un controllo con associazione a dati, ad esempio un controllo GridView, DetailsView o FormView. Associare la proprietà SelectedValue del controllo di ricerca al campo correlato nell'origine dati del controllo del contenitore. Impostare quindi la proprietà DataSourceID del controllo di ricerca su un controllo origine dati che recupera i valori della ricerca. Impostare la proprietà DataTextField del controllo di ricerca sul campo della tabella della ricerca che contiene i valori da visualizzare e la relativa proprietà DataValueField sul campo dalla tabella di ricerca che contiene l'identificatore univoco per il valore della ricerca, se applicabile.

Nell'esempio di codice seguente viene illustrato un controllo DropDownList incluso nel modello InsertItemTemplate di un controllo FormView (si potrebbe anche trattare di un modello InsertItemTemplate di TemplateField incluso nella proprietà Fields di un controllo DetailsView o nella proprietà Columns di un controllo GridView ). La proprietà SelectedValue del controllo DropDownList utilizza il metodo Bind per l'associazione bidirezionale al campo CategoryID della riga corrente per il controllo FormView. La proprietà DataSourceID del controllo DropDownList è impostata su un controllo origine dati distinto che recupera l'elenco degli ID e dei nomi di categoria possibili. La proprietà DataTextField del controllo DropDownList è impostata sul campo CategoryName dell'origine dati della ricerca in modo che venga visualizzato l'elenco dei nomi di categoria possibili. La proprietà DataValueField del controllo DropDownList è impostata sul campo CategoryID dall'origine dati della ricerca per il nome di categoria correlato. Quando un utente seleziona un nome di categoria nell'elenco, la proprietà SelectedValue del controllo DropDownList viene impostata sull'ID della categoria per il nome di categoria selezionato.

<tr>
  <td align="right"><b>Category:</b></td>
  <td><asp:DropDownList ID="InsertCategoryDropDownList" 
                        SelectedValue='<%# Bind("CategoryID") %>' 
                        DataSourceID="CategoriesDataSource"
                        DataTextField="CategoryName"
                        DataValueField="CategoryID"
                        RunAt="Server" />
  </td>
</tr>
<tr>
  <td align="right"><b>Category:</b></td>
  <td><asp:DropDownList ID="InsertCategoryDropDownList" 
                        SelectedValue='<%# Bind("CategoryID") %>' 
                        DataSourceID="CategoriesDataSource"
                        DataTextField="CategoryName"
                        DataValueField="CategoryID"
                        RunAt="Server" />
  </td>
</tr>

Lo stesso controllo di elenco può essere utilizzato in un modello di elementi di modifica.

Vedere anche

Attività

Procedura: eseguire l'associazione dati in un controllo basato su modello

Concetti

Associazione a database

Associazione a oggetti business

Associazione a dati gerarchici

Cenni preliminari sull'accesso ai dati ASP.NET