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.