Dynamic Data - recuperare la action corrente

by Andrea 18 December 2008 06:42

Se avete la necessità di recuperare la action corrente all'interno di un FieldTemplate (o di una pagina dei Dynamic Data), il codice che potete utilizzare è il seguente:

   1: RequestContext requestContext = DynamicDataRouteHandler.GetRequestContext(HttpContext.Current);
   2: string action = requestContext.RouteData.GetRequiredString("action");
   3:  
   4: if (string.Compare(action, "Details", true) == 0)
   5: {
   6:     ...
   7: }
   8: else
   9: {
  10:     ...
  11: }

Una delle motivazioni in cui può essere utile recuperare tale informazione è nel caso di un FileldTemplate custom nella modalità di sola lettura dei dati, che viene utilizzato sia per la lista che per il dettaglio, e quindi può esserci la necessità di modificare la visualizzazione a seconda della action.

Nel mio caso, ho inserito due panel nel FieldTemplate e con il codice qui riportato ne modifico la visibilità (ovviamente eseguendo il databind dei soli interessati). Un panel contiene una Label con un contatore dei dati (utilizzato nella lista), mentre il secondo panel contiene una ListView che visualizza l'elenco dei figli (utilizzato nel Dettaglio). Questo per visualizzare informazioni recuperate da una relazione molti a molti.

Tags: , ,

ASP .NET

Dynamic Data - ScaffoldTable a false e CustomPages

by Andrea 16 December 2008 09:17

Può sembrare che il post parli di due argomenti distinti, ma non è così. Infatti il parametro ScaffoldTable e le CustomPage hanno una cosa in comune, e riguarda la visibilità delle tabelle.

Lavorando con i Dynamic Data, avevo la necessità di non visualizzare una mia classe/tabella. Per fare questo, la cosa è veramente semplice:

  • Impostare nel Global.asax ScaffoldAllTables = false, in modo essere noi a specificare quali tabelle visualizzare e quali no. (Per default lavoro già con questo parametro impostato a false, perchè le tabelle che di solito visualizzo con i Dynamic Data sono poche, rispetto quelle presenti nel database).
  • Creare una partial class della classe del modello di Entity Framework (o di Linq to SQL) e impostare l'attributo ScaffoldTable a false per nascondere, oppure a true per farle visualizzare.
    [ScaffoldTable(false)]
    public partial class Users
    {
    }

La cosa divertente (si fa per dire), è che sebbene abbia impostato tale attributo a false, la tabella era comunque visibile.
Ho fatto diverse prove, e poi ho ragionato nel cosa differisse questa classe rispetto a quelle non visibili, e l'unica risposta era...le CustomPage.

Se si imposta nella classe l'attributo ScaffoldTable con valore false, se esistono delle Custom page che le appartengono, la classe sarà (lo stesso) visibile nel nostro sito creato con i Dynamic Data.

Infatti, rinominando la cartella contenente le custom page da Users a _Users (oppure cancellando la cartella) la tabella si è correttamente eliminata dalla visualizzazione.
Non sono d'accordo su questo comportamento, e mi sarei aspettato che l'attributo avesse la priorità, ma c'è anche da dire, che se una persona crea delle custom page è perchè ha l'intezione di vidualizzare quei dati. Ecco quindi dei pro che dei contro per questa scelta.

Il lato negativo di questo aspetto è che uno è costrettto a eliminare eventuali CustomPage che avevo già creato (e customizzato), e che dovrò ripristinare appena quella sezione (quella tabella) dovrà essere visibile all'utente.

Update: Ho inserito la segnalazione su connect per capire se il comportamento è un by design oppure un bug. Ecco il link
https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=388504

Tags: , ,

ASP .NET

Usare uno UserControl come Page Templates per i Dynamic Data

by Andrea 26 November 2008 00:04

Leggo oggi nel ble di David Ebbo della possibilità di associare uno UserControl come Page Template, e il tutto sia con l'utilizzo del routing, ma anche senza.

Il post è il seguente: Using User Controls as Page Templates in Dynamic Data

Non ho ancora provato la cosa, ma sicuramente a breve farò qualche test per capirne meglio i vantaggi. L'unico che vedo al momento è la possibilità di riutilizzare degli usercontrol esistenti eseguendo delle modifiche minime.

Technorati Tags: ,

Tags: , ,

ASP .NET

Dynamic Data e Field Template per relazione Molti a Molti

by Andrea 17 November 2008 01:39

Chi di voi ha iniziato a utilizzare i Dynamic Data con l’Entity Framework si sarà accorto della difficolta (o impossibilità) di editare le relazioni molti a molti delle proprie classi.

Un post di David Ebbo ci viene in soccorso proponendoci la creazione di un Field Template in grado di renderizzare una lista di CheckBox per visualizzare ed editare queste informazioni.
Il post è il seguente: A ‘Many To Many’ field template for Dynamic Data

Nello zip che potrete scaricare sono contenuti 2 Field Template, uno per la lettura e uno per l’edit delle relazioni (questi controlli saranno inseriti nella prossima versione dei Dynamic Data).ManyToMany_read ManyToMany_Edit

Tags: , ,

ASP .NET

AutoComplete Extender - alcuni workaround

by Andrea 04 April 2008 14:04

BoxRicercaStò utilizzando il controllo AutoComplete Extender, contenuto negli Ajax Control Toolkit, e mi sono trovato ad affrontare diversi problemi dovuti a bug del controllo ed altri dovuti a problemi con IE6.
Voglio però sottolineare che grazie alla flessibilità di questi controlli, sono riuscito facilmente a trovare alcuni workaround senza dover scrivere montagne di codice.

Nella mia applicazione mi trovo ad avere un controllo TextBox a cui è collegato l'AutoComplete Extender (per agevolare l'inserimento del testo), e posizionati subito sotto sono presenti alcune DropDownList.

Iniziamo dal primo problema:
con IE6, all'apertura del pannello dell'AutoComplete Extender, le DropDownList rimangono in primo piano, "bucando" il pannello.
La soluzione che ho trovato è stata quella di intervenire nelle animations, inserendo alcuni ActionScript che nascondono le DropDownList quando il pannello si apre, e le rivisualizzano non appena il pannello si stà chiudendo. In questo modo, l'AutoComplete Extender sarà visualizzato senza problemi grafici.

Altro problema:
alla chiusura del pannello non riuscivo più a modificare il valore delle DropDownList perchè il pannello viene nascosto impostando lo stile visibility, che lo fa quindi mantere in primo piano, bloccando l'accesso ai controlli posti sotto.
La soluzione più veloce è stata quella di intervenire anche qui nelle ActionScript, recuperandomi l'oggetto del pannello (che ha l'ID composto da BehaviorID__completionListElem) e settandogli la proprietà display a none. Facendo così, il pannello non risulta più essere in primo piano, e si ha l'accesso ai controlli in precedenza bloccati.

Ecco qui il codice per risolvere questi due problemi:

<ajaxToolkit:AutoCompleteExtender 
    runat="server" 
    BehaviorID="AutoCompleteEx" 
    ID="autoComplete1"
    TargetControlID="CittaCod" 
    ServiceMethod="GetCityList" 
    ServicePath="~/Services.asmx"
    MinimumPrefixLength="2" 
    CompletionInterval="1000" 
    FirstRowSelected="true" 
    EnableCaching="true"
    CompletionSetCount="20" 
    CompletionListCssClass="autocomplete_completionListElement"
    CompletionListItemCssClass="autocomplete_listItem" 
    CompletionListHighlightedItemCssClass="autocomplete_highlightedListItem">
    <Animations>
    <OnShow>
        <Sequence>
            <OpacityAction Opacity="0" />
            <HideAction Visible="true" />
            <ScriptAction Script="
                var behavior = $find('AutoCompleteEx');
                if (!behavior._height) {
                    var target = behavior.get_completionList();
                    behavior._height = target.offsetHeight - 2;
                    target.style.height = '0px';
                }" />
            <Parallel Duration=".4">
                <FadeIn />
                <Length PropertyKey="height" 
                        StartValue="0" 
                        EndValueScript="$find('AutoCompleteEx')._height" />
            </Parallel>                                
            <ScriptAction Script="                 
                var ddlPrezzoMin = $get(ddlPrezzoMinID);
                var ddlPrezzoMax = $get(ddlPrezzoMaxID);
                var ddlMqMin = $get(ddlMqMinID);
                var ddlMqMax = $get(ddlMqMaxID);
                
                ddlPrezzoMin.style.visibility = 'hidden';
                ddlPrezzoMax.style.visibility = 'hidden';
                ddlMqMin.style.visibility = 'hidden';
                ddlMqMax.style.visibility = 'hidden'; 
                " />
        </Sequence>
    </OnShow>
    <OnHide>
        <Sequence>
            <ScriptAction Script="    
                var ddlPrezzoMin = $get(ddlPrezzoMinID);
                var ddlPrezzoMax = $get(ddlPrezzoMaxID);
                var ddlMqMin = $get(ddlMqMinID);
                var ddlMqMax = $get(ddlMqMaxID);
                
                ddlPrezzoMin.style.visibility = 'visible';
                ddlPrezzoMax.style.visibility = 'visible';
                ddlMqMin.style.visibility = 'visible';
                ddlMqMax.style.visibility = 'visible';
                
                var autoCompleteElement = $get('AutoCompleteEx_completionListElem');
                autoCompleteElement.style.display = 'none';                                    
                " />
            <Parallel Duration=".4">
                <FadeOut />
                <Length 
                    PropertyKey="height" 
                    StartValueScript="$find('AutoCompleteEx')._height" 
                    EndValue="0" />
            </Parallel>
        </Sequence>
    </OnHide>
    </Animations>
</ajaxToolkit:AutoCompleteExtender>

 

Tags: , , , ,

ASP.NET AJAX

Nascondere un tag BR con gli stili

by Andrea 10 July 2007 15:07

E' proprio vero, non si finisce mai di imparare!!

Avevo un label e successivamente un tag BR (per il ritorno a capo), e nella label, in un determinato tema, è applicato uno style "display:none". Questo però causava il problema di avere graficamente una riga vuota.

Mi sono detto, ma se provo ad applicare il "display: none" anche al BR? Ebbene, a mia sorpresa, funziona e quindi non viene visualizzato evitando così quel ritorno a capo in più. :D
Questa proprio non l'evrei mai pensata...

Quindi, se volete nascondere un tag BR usate tranquillamente gli stili!
+1 per i CSS ;)

Technorati tags: , ,

Tags: , ,

ASP .NET

AJAX Control Toolkit Tabs, nascondere un TabPanel

by Andrea 06 July 2007 11:07

Da un post fatto nei newsgroup sono venuto a conoscenza di uno strano comportamento che affligge i TabPanel del controllo Tabs degli AJAX Control Toolkit e ho trovato un semplice workaround.
CropperCapture[5]

Infatti, se dovete nascondere un tab, viene spontaneo usare la proprietà Visible del TabPanel da nascondere ( e direi che la cosa, a mio avviso, sarebbe una cosa ovvia) ma non è così.
Impostando a false la proprietà Visible del primo TabPanel (per esempio), il tab viene correttamente nascosto, ma rimane visibile il testo contenuto nel HeaderText.

TabPippo.Visible = false;
CropperCapture[6]

Per risolvere questo inconveniente, al posto di utilizzare la proprietà Visible usate la proprietà Enabled, che farà nascondere completamente il tab in questione.

TabPippo.Enabled = false;
CropperCapture[7]

Il perchè di questi comportamenti non me lo spiego... Quello che mi sarei aspettato invece è che la proprietà Visible, se impostata a False, nascondesse completamente il tab, mentre l'Enabled a True che mi disabilitasse il click in modo da non poter abilitare quel TabPanel (e il tab dovrebbe rimanere visibile), ma forse sarebbero stati dei comportamenti troppo normali.

...ma l'importante è conoscerli ed eventualmente trovare dei workaround come questo (in tempi brevi).... ;)

Tags: , , ,

ASP.NET AJAX

Creare un Control Extender, da dove cominciare

by Andrea 19 June 2007 23:06

AspNetAjax Se avete intenzione di cimentarvi a creare un Control Extender sappiate che la cosa è più semplice di quello che credete.

Per cominciare vi consiglio alcuni link:
Il primo è un tutorial che trovate nel sito di ASP .NET AJAX e vi guiderà passo passo: Creating a new extender

Un'altra risorsa molto utile è il webcast tenuto da :
ASP.NET 2.0 AJAX: Extending ASP.NET AJAX

Ed infine il link al progetto AJAX Control Toolkit. All'interno del progetto scaricato è disponibile anche il pacchetto di installzione per aggiungere il template per creare un Control Extender (il file si chiama AjaxControlExtender.vsi) e permetterà di creare in automatico i file necesssari allo sviluppo di un Extender (file *Behavior.js, *Designer.cs ed *Extender.cs): AJAX Control Toolkit

Tags: , , , ,

ASP.NET AJAX

ASP .NET AJAX e validazione di controlli aggiunti in un postback

by Andrea 21 March 2007 22:03

Se avete provato a validare controlli inseriti in un postback all'interno di un UpdatePanel, vi sarete accorti che la cosa non funziona e nemmeno genera errori.
La storia è semplice, l'UpdatePanel renderizza solamente il suo contenuto e non aggiorna le altre pagine della pagina, che nel caso dei validatori avrebbero contenuto degli script per agganciare il validatore al controllo.
Matt Gibbs, che fa parte del team di sviluppo di ASP .NET AJAX ci è venuto in contro e ha modificato il codice dei validatori facendo si che gli script necessari venissero registrati nella pagina tramite lo ScriptManager.
A questo link trovate un suo post sull'argomento e sono disponibili i sorgenti dei validatori modificati e pronti per il download.

Per sostituire i validatori, è sufficente referenziare la dll contenente i validatori modificati ed aggiungere nella sezione pages del Web.config questa sezione tagMapping:

<tagMapping>
    <add tagType="System.Web.UI.WebControls.CompareValidator"
        mappedTagType=" Sample.Web.UI.Compatibility.CompareValidator, Validators, Version=1.0.0.0"/>
    <add tagType="System.Web.UI.WebControls.CustomValidator"
        mappedTagType=" Sample.Web.UI.Compatibility.CustomValidator, Validators, Version=1.0.0.0"/>
    <add tagType="System.Web.UI.WebControls.RangeValidator"
        mappedTagType=" Sample.Web.UI.Compatibility.RangeValidator, Validators, Version=1.0.0.0"/>
    <add tagType="System.Web.UI.WebControls.RegularExpressionValidator"
        mappedTagType=" Sample.Web.UI.Compatibility.RegularExpressionValidator, Validators, Version=1.0.0.0"/>
    <add tagType="System.Web.UI.WebControls.RequiredFieldValidator"
        mappedTagType=" Sample.Web.UI.Compatibility.RequiredFieldValidator, Validators, Version=1.0.0.0"/>
    <add tagType="System.Web.UI.WebControls.ValidationSummary"
        mappedTagType=" Sample.Web.UI.Compatibility.ValidationSummary, Validators, Version=1.0.0.0"/>
</tagMapping>

In questo modo, i validatori dichiarati come <asp:CompareValidator .../> e gli altri, saranno ridirezionati nel nuovo namespace (nell'assembly appena aggiunto).
Occhi quando vi trovate nel codebehind al namespace che state usando, controllate di puntare effettivamente alla nuova dll.

E tutto questo vale per:

  • CompareValidator
  • CustomValidator
  • RangeValidator
  • RegularExpressionValidator
  • RequiredFieldValidator
  • ValidationSummary

Devo ammettere che ha fatto proprio un buon lavoro, e gli faccio i miei complimenti perchè sarebbe stata una grave mancanza non avere la validazioni in controlli aggiunti dinamicamente in un postback.

Technorati tags: ,

Tags: , , , ,

ASP.NET AJAX

AJAX Control Toolkit - ConfirmButtonExtender in una colonna di cancellazione

by Andrea 21 March 2007 13:03

Queste sono le cose che mi piacciono, quando con poche righe di codice si risolve immediatamente un problema. Infatti con una riga di markup è possibile aggiungere ad un button una messagebox di conferma, che io utilizzo (ad esempio) quando devo eseguire delle cancellazioni, e tutto grazie al ConfirmButtonExtender. (così non serve neanche scrivere javascript) In questo esempio, ho usato il ConfirmButtonExtender in una colonna di cancellazione creamdomi un colonna con un TemplateField.

<asp:TemplateField > 
   <ItemTemplate> 
        <asp:LinkButton 
            CommandName="delete" 
            runat="server" 
            ID="deleteRecord" 
            Text="delete" /> 
        <ajaxControlToolkit:ConfirmButtonExtender 
            ID="bDeleteExtender" 
            runat="server"
            TargetControlID="deleteRecord" 
            ConfirmText="Sicuro di voler cancellare?" /> 
   </ItemTemplate> 
</asp:TemplateField>
 Bello, semplice e funziona

Tags: , ,

ASP.NET AJAX