#972 - Personalizzare la collezione InsertParameters con il controllo LinqDataSource di ASP.NET 3.5
di Marco Leoncini, in ASP.NET 3.5, DataBinding, LinqDataSource, 2 febbraio 2009
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.
Approfondimenti
-
Scopri i nostri nuovi libri su ASP.NET 4.0, C# 4 e Visual Basic 2010: in offerta lancio al 20% di sconto!
-
.NET Framework 4.0 beta 1: Visual Studio 2010
-
Il primo whitepaper su ASP.NET 4.0 beta 1
-
#1003 - Evitare postback multipli in un UpdatePanel
-
ASP.NET 4.0 AJAX arriva alla Preview 5, in attesa della beta2 di ASP.NET 4.0
-
#1004 - Utilizzare le DataAnnotation con ASP.NET Dynamic Data Controls
-
#1006 - Personalizzare il layout di visualizzazione con i Dynamic Data Controls
-
#1010 - Usare jQuery in un custom editor di ASP.NET Dynamic Data Control
-
#982 - Introduzione al databinding con ASP.NET MVC
-
#984 - Usare i controlli charting di ASP.NET con ASP.NET MVC
-
jQuery diventa centrale nella strategia Microsoft per ASP.NET
-
Speciale ASP.NET Charting: grafici per tutti i gusti!

















Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.