Gestire UserControls comuni a diverse web form in una classe base che ...

martedì 23 ottobre 2012 - 13.01
Tag Elenco Tags  C#  |  VB.NET  |  .NET 2.0  |  .NET 3.0  |  .NET 3.5  |  .NET 4.0  |  Visual Studio 2010  |  Visual Studio 2008

EnricoBSC Profilo | Newbie

Salve, il mio sito web asp.net dispone di alcune pagine (due o tre) che contengono ma solo in parte, i medesimi UserControl e web control dichiarati con lo stesso identico ID ma disposti in modo diverso e inconciliabile rispetto all'ipotesi di creare un unico UserControl contenitore che contenga le sezioni comuni delle varie pagine.
Si tratta di pagine che hanno funzioni similari ma distinte e che hanno molti aspetti (anche del codebehind) in comune. Il mio intendo sarebbe quello di creare una classe base che erediti da "System.Web.UI.Page" in grado di accedere a livello dichiarativo ai nomi dei controlli (utente e non) e ai rispettivi metodi esposti, (visto che come detto nel codice html hanno ovviamente lo stesso nome).
L'idea di implementare una classe base in una dll separata (chiamata nella fattispecie WebLogic) e che nell'evento Page_Init esegua il FindControl sui controlli comuni dichiarati a livello di pagina e che poi utilizzi la reflection per accedere ai metodi degli UserControl potrebbe incidere sulle performance e la scarterei. (A proposito, esiste il modo di referenziare uno UserControl in una dll separata dal web site in modo da poter accedere nel codice ai metodi specifici del tipo?)
L’idea invece di creare una classe base "System.Web.UI.Page" nella sezione App_Code del web site nella quale dichiarare WithEvents i controlli e gli UserControl comuni potrebbe essere una buona soluzione?
Come è possibile associare questi controlli o UserControl ai controlli delle varie pagine? Con il metodo FindControl control nell’evento Page_Init? Oppure, essendo questa la classe base di pagine direttamente associate al codice html contenuto nei vari file .aspx, l’associazione avviene implicitamente come per il normale codebehind delle pagine.
Infine, questo tipo di operazione potrebbe incidere negativamente sulle prestazioni a prescindere dal fatto noto che l’inheritance comunque rallenta moderatamente le prestazioni?
Grazie in anticipo per l’attenzione.
Enrico.

Gluck74 Profilo | Guru

ciao,
sinceramente non ho capito molto di quello che vorresti fare.......

Comunque: una pagina base secondo me va benissimo. Che tu la metta nel App_Code o in una dll separate, potrebbe fare poca differenza, l'importante è non creare riferimenti circolari tra gli assembly e le classi.

per quanto riguarda gli UserControl.... bisogna che mi spieghi di nuovo perché non sono riuscito a capire.

ciao
____________
http://glucolo.wordpress.com
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

EnricoBSC Profilo | Newbie

Nel code behind di una web form, (aspx.vb o cs), se digiti l'id di un controllo o di un controllo utente contenuto nella pagina, l'intellinense ti consente la visualizzazione (hard typed) dei membri pubblici della partial class sottostante allo user control:
es:
Partial Class Output_Cockpit_UserControls_ucChart
Inherits System.Web.UI.UserControl
...

Nel codebehind della pagina è possibile invocare per esempio il seguente metodo:
ucChart.ShowChart() o ucChart.MyGenericMethod() etc... suggerito dall'intellisense.

Immagino che questo sia possibile farlo anche nell'App_Code del web site (anche se spesso ne viene in qualche modo sconsigliato l'uso).
Richiamare nel seguente modo il metodo ucChart.MyMethod() da una dll separata rispetto al sito web non mi risulta si possa fare così facilmente...
Ad ogni modo, quello che mi preme di fare è evitare di implementare in ognuna di queste pagine dei metodi che sono in effetti comuni, nel senso che fanno la stessa cosa in ogni pagina. Metodi uguali che contengono le stesse istruzioni con dei riferimenti (per esempio ucChart.ShowChart() o MyTextBox.Text = "Text") a istanze diverse di controlli o controlli utente uguali (ovvero dello stesso tipo), con gli stessi id ma posti in diverse pagine.

Se dunque io implemento una pagina base che eredita da System.Web.UI.Page, come posso richiamare i suddetti metodi tipizzati sui controlli utente nella seguente forma: ucChart.ShowChart() anche nella pagina base?
Dovrò dichiarare a livello di pagina lo user control nel seguente modo:

Protected WithEvents MyUserControl as Output_Cockpit_UserControls_ucChart
o
protected Output_Cockpit_UserControls_ucChart MyUserControl;

e poi invocare ad ogni Page_Init della classe base il metodo FindControl() sull'id dello user control nelle pagine (che è sempre uguale)? Oppure se dichiaro il controllo con un nome che corrisponda esattamente all'id assegnato al controllo nel codice aspx della pagina, in qualche modo avviene una associazione implicita anche senza invocare il FindControl come per il codebehind di qualsiasi pagina aspx? Doppi riferimenti, nella pagina base e nella pagina derivata agli stessi controlli potrebbero causare delle latenze o dei rallentamenti?
Mi scuso per la mancata chiarezza e ringrazio per la disponibilità.
Enrico.





EnricoBSC Profilo | Newbie

In sostanza per fare un esempio:
ho tre pagine diverse che contengono i controlli ucChart1 e ucChart2 (entrambi sono controlli utente di tipo ucChart).
In tutte e tre le pagine i controlli utente hanno gli id identici (ucChart1 e ucChart2).
Tutte e tre le pagine hanno il seguente metodo:

private void VisualizzaGrafici()
{
ucChart1.VisualizzaGrafico();
ucChart2.VisualizzaGrafico();
}

vorrei disporre di una classe base che NON abbia un metodo VisualizzaGrafici() con due parametri ucChart come il seguente:

VisualizzaGrafici(ucChart ucChart1, ucChart ucChart2) {...}

richiamato poi dalle classi derivate.
Ma una classe base che abbia il metdo non statico VisualizzaGrafici() senza parametri e che faccia riferimento diretto ai controlli ucChart1 e ucChart2.

private void VisualizzaGrafici()
{
ucChart1.VisualizzaGrafico();
ucChart2.VisualizzaGrafico();
}


Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5