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

di Marco Leoncini, in ASP.NET 3.5, DataBinding, LinqDataSource,

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>

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi