#972 - Personalizzare la collezione InsertParameters con il controllo LinqDataSource di ASP.NET 3.5

Il controllo LinqDataSource, a differenza degli altri data source control, utilizza la collezione InsertParameters per valorizzare i campi dell'entità solo se questi sono null.
E' quindi necessario gestire l'evento Inserting al fine di impostare le proprietà dell'entità con valori provenienti ad esempio da QueryString o altri controlli.
La creazione dell'EventHandler può portare alla scrittura di codice lungo e ripetitivo, con i problemi che questa pratica può alla lunga portare.
Questo problema è aggirabile creando un Adapter, così da riutilizzare la collezione InsertParameter per impostare le proprietà dell'entità.
Creiamo una classe che estenda il tipo ControlAdapter e chiamiamola MyLinqDataSourceAdapert.

public class MyLinqDataSourceAdapert: ControlAdapter {...}

Dichiariamo un campo privato di tipo LinqDataSource ed eseguiamo l'override del metodo Init:

//campo privato per mantenere il rifermiento al LinqDataSource 
private LinqDataSource _linqDataSource; 
 
public MyLinqDataSourceAdapert() { } 
 
protected override void OnInit(EventArgs e) 
{ 
  base.OnInit(e); 
 
  //recupero il riferimento al controllo a cui è associato l'adapter 
  _linqDataSource = Control as LinqDataSource; 
 
  //controllo  
  if (_linqDataSource != null) 
  { 
    //mi registro per l'evento interting 
    _linqDataSource.Inserting += new EventHandler<LinqDataSourceInsertEventArgs>(_linqDataSource_Inserting); 
  } 
  else 
  {  
    //se sil controllo associato all'adapter non è compatibile sollevo un eccezione 
    throw new ApplicationException("Tipo non supportato"); 
  } 
}

Nel metodo Init recuperiamo il controllo associato all'Adapter, verifichiamo che sia del tipo LinqDataSource e infine registriamo un event Handler per l'evento Inserting.

Nell'EventHandler, tramite reflection recuperiamo tutte le proprietà dell'entità da persistere sul database, estraiamo i valori dai singoli parametri e, controllando che il nome coincida con quello delle proprietà, ne impostiamo il valore.

void _linqDataSource_Inserting(object sender, LinqDataSourceInsertEventArgs e) 
{ 
  //se l'operazione non è stata annullata 
  if (!e.Cancel) 
  { 
    //recupero tutte le proprietà 
    PropertyInfo[] _propertyInfo = e.NewObject.GetType().GetProperties(); 
 
    //eseguo due cicli per valorizzare i campi corrispondenti hai parametri 
    foreach (DictionaryEntry entry in _linqDataSource.InsertParameters.GetValues(HttpContext.Current, _linqDataSource)) 
    { 
      for (int i = 0; i < _propertyInfo.Length; i++) 
      { 
        if (_propertyInfo<i>.Name == entry.Key.ToString()) 
           _propertyInfo<i>.SetValue(e.NewObject, entry.Value, null); 
 
      } 
    } 
  } 
}

Non ci rimane altro che configurare l'Adapter appena creato, per far questo creiamo un file con l'estensione .browser dentro la directory /App_Browsers/ ed aggiungiamo le seguenti righe:

<browsers> 
  <browser refID="Default"> 
    <controlAdapters> 
        <adapter controlType="System.Web.UI.WebControls.LinqDataSource" 
                 adapterType="MyAdapter.MyLinqDataSourceAdapert" /> 
  </controlAdapters> 
</browser>

Nota: Questo script contiene un allegato.

IL CONTENUTO
CONNECTIONSTRING
Ti serve una stringa di connessione ad un database?
PROVIDER ASP.NET 2.0, 3.5 e 4.0

Seleziona il tuo provider per avere il web.config pronto per Membership, Roles e Profile API.

SCRIPT VIA E-MAIL

Iscriviti alle nostre newsletter unoscript@lgiorno e Xcript per ricevere gli script via e-mail.

MEDIA
IN EVIDENZA
MISC