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
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
- Effettuare il multi-checkout in linea nelle pipeline di Azure DevOps
- Sfruttare una CDN con i bundle di ASP.NET
- Esaminare documenti XML con namespace utilizzando LINQ to XML
- Alleggerire le applicazioni WPF sfruttando gli oggetti Freezable
- Effetto turnstile su tutte le pagine con il Windows Phone Toolkit
- Le DirectInk API nella Universal Windows Platform
- Gli oggetti CallOut di Expression Blend 4.0


