Posts by category: ASP.NET

by in / ASP.NET / JavaScript
No peoples think this is good
Knockout.js: MVVM in JavaScript

Knockout.js: MVVM in JavaScript

Volete velocizzare la vostra applicazione web scrivendo meno codice possibile?
Provate Knockout.js, un’API JavaScript che facilita lo sviluppo di interfacce utente introducendo lato client il pattern MVVM. Vediamo come:

Knockout.js si integra perfettamente con ASP.NET MVC3 grazie all’utilizzo di AJAX, JSON e del ModelBinder.

Scarica il progetto con il codice di esempio >> Download

 

/ Read Article /
by in / ASP.NET
No peoples think this is good

7 modi di fare rendering in ASP.NET MVC3

Il pattern MVC ci dice che il controller deve preparare i dati del modello e scegliere la vista da visualizzare e che la vista ha il solo compito di formattare i dati. Nella realtà però le informazioni da visualizzare hanno diversa granularità e contesto e non sempre la linearità del metodo classico risolve tutti i casi. Vediamo allora quali possibilità ci vengono offerte dal framework ASP.NET MVC per quanto riguarda il rendering dei dati sulla vista:

1. Strongly Typed Views

Cominciamo dal modo classico.

Il controller prepara il model (3-9) e lo passa direttamente alla vista (12).

mvc-strongly-typed-views

Nella vista definisco il tipo di modello (in razor con @model) e l’IntelliSense fa il resto.

Quando usare viste tipizzate?

Sempre e il più possibile, magari valutando l’abbinamento con il pattern ViewModel.

2. Codice in-line

Posso scrivere codice C# direttamente nelle viste per organizzare il markup in base al modello.

Quando usare codice in-line?

Portare la logica nelle viste va contro la separation of concerns tipica di MVC e renderà il codice non testabile. Se il codice da scrivere va oltre un semplice foreach è consigliato metterlo sul controller, oppure gestirlo con un Html Helper o in una RenderAction.

3. Html Helper Methods

Scrivere codice html alle volte può risultare ripetitivo, ecco perché il framework ci mette a disposizione degli Extension Methods che nascondono la scrittura dei più comuni tag html.

L’output è il seguente:

Quando usare gli Html Helper Methods?

Devo confessare che a me scrivere codice html piace, non userei quindi gli helper per banalità quali label o textbox perché peggiorano la leggibilità del codice. Trovo molto utili invece quelli che derivano da HtmlHelper<TModel> ovvero gli helper fortemente tipizzati. Ad esempio:

4. Html.Partial() e Html.RenderPartial()

Vi ricordate gli User Control del paradigma WebForm? Esistono anche in MVC e si chiamano PartialView. Le viste parziali sono praticamente delle viste senza master page, per richiamarle possiamo usare due helper: Html.Partial() e Html.RenderPartial(). La differenza? Partial ritorna una stringa, mentre RenderPartial scrive direttamente nella Response.

Quando usare le Partial View?

Le partial view vengono utilizzate per condividere del codice tra più viste, ad esempio un menu di navigazione, il footer oppure l’header. Possono contenere codice in-line, chiamate ad altri helper, ma non hanno logica di business. Per questi motivi i dati vengono passati attraverso il Model oppure tramite ViewData/ViewBag dell’action chiamante. Se vogliamo utilizzarle per i classici cross-cutting concern dobbiamo inserire la logica in un base controller, in un filtro oppure nel ViewData di ogni chiamante.

5. Html.Action() e Html.RenderAction()

Vogliamo avere una partial view con della logica applicativa? Possiamo richiamare all’interno della vista una action di un controller attraverso l’helper RenderAction. Ogni volta che chiamiamo questo metodo viene generata una richiesta che attraversa tutta la pipeline di MVC e renderizza il codice della vista direttamente nella Response. Utilizzi tipici di questa tecnica sono i widget. Ad esempio:

Quando utilizzare Html.RenderAction()?

La scelta tra mettere tutto in una action e fare un’altra richiesta dipende dalla volontà di mantenere separata la logica tra le chiamate. Se parliamo in termini di riutilizzo del codice o di cross-cutting concern è opportuno intraprendere prima altre strade come un base controller oppure un global filter.

6. Custom Html Helper Methods

Oltre agli helper contenuti nel framework possiamo definirne di personalizzati semplicemente sfruttando la tecnica degli Extension Methods, un esempio:

Quando utilizzare un helper personalizzato?

Potenzialmente qualsiasi metodo che ritorna una stringa può essere trasformato in un helper. E’ buona regola comunque pensare ad un helper come ad un pattern ovvero alla soluzione di un problema ricorrente.

7. Razor Template

Cito testualmente dal post di Scott Guthrie: “One other useful (and extremely powerful) feature we are enabling with Razor is the ability to pass “inline template” parameters to helper methods. These “inline templates” can contain both HTML and code, and can be invoked on-demand by helper methods”. Ecco un esempio e qui sotto un altro:

Quando e perché utilizzare un razor template?

Non l’ho ancora capito…

Resources:

  • MvcMusicStore di Jon Galloway
  • Inside Razor – Part 3 – Templates (Andrew Nurse)
/ Read Article /
by in / ASP.NET
No peoples think this is good

Utilizzare Memcached con ASP.NET

Vediamo come in 5 minuti possiamo configurare Memcached per la nostra applicazione ASP.NET.

Passo 1 – Installazione di Membase Server

Invece di installare Memcached come prodotto “stand-alone” ho deciso di utilizzare Membase Server un “key-value database management system” che tra l’altro permette di gestire Memcached attraverso una comoda console web. Per installare Membase Server dobbiamo scaricare il pacchetto di installazione specifico per il nostro sistema operativo, nel mio caso Windows.

membase-install

Passo 2 – Configurazione del server

Una volta completata l’installazione ci viene proposto un wizard per la configurazione del server.

membase-web-console

Nel primo step definiamo la destinazione su disco dello storage e quanta RAM dedicare alla cache.

membase-step1

OK, ma Memcached non era un database in memoria, perché allora ci chiede spazio su disco?
Sì memcached salva i dati in memoria, ma il server di Membase permette anche di scegliere come database una versione nativa che aggiunge a memcached caratteristiche di persistenza e replica.

Il secondo step consiste appunto nella scelta del tipo di storage (in Membase viene definito Bucket) e noi scegliamo Memcached.

membase-step2

Gli ultimi due step consentono di configurare le notifiche sugli aggiornamenti del software e le credenziali di accesso alla console.

Passo 3 – Se siamo in DHCP

Se siamo in DHCP e vogliamo utilizzare Membase in locale dobbiamo andare nella cartella Server/bin sotto l’installazione di Membase e lanciare da prompt (come amministratore) i seguenti comandi:

> service_stop.bat
> service_unregister.bat
> service_register.bat ns_1@127.0.0.1
> service_start.bat

A questo punto dovremmo avere Membase configurato in locale.

Passo 4 – Scaricare le librerie client

Per poter utilizzare Memcached dalla nostra applicazione dobbiamo ora installare le librerie client Enyim Memcached versione 2.11 e Membase versione 2.14, invece di scaricarle da internet possiamo utilizzare il Package Manager di NuGet.

 

memcached-client

Passo 5 – Configurare l’applicazione web

Nel web.config dobbiamo aggiungere la seguente configurazione:

Passo 6 – Hello Memcached

A questo punto non ci resta che instanziare il client e salvare il nostro primo valore in Memcached.

Attenzione! La creazione del client è molto dispendiosa, è opportuno quindi instanziarlo una volta sola magari alla partenza dell’applicazione.

Dalla console di Membase possiamo monitorare l’attività del server e scegliere se necessario di aggiungere a caldo altri server al cluster.

membase-monitor

 

A questo punto siamo liberi di utilizzare Memcached per velocizzare la nostra applicazione ASP.NET ed alleggerire il carico sul nostro caro e vecchio database relazionale!

 

Fonte: Getting Started with Membase and C#

/ Read Article /
by in / ASP.NET / Eventi
No peoples think this is good

Tutte le novità di ASP.NET MVC3: Slide e codice dell’evento

Di seguito potete trovare le slide e il codice della mia sessione su Tutte le novità di ASP.NET MVC3.

Nota: Per eseguire il codice di esempio è necessario modificare i percorsi del file database che trovate nell’App_Data.

Codice di esempio pronto per il download >> Download

/ Read Article /
by in / ASP.NET / Castle Project
No peoples think this is good

Mappare MonoRail su ASP.NET MVC 2.0

Nel mio viaggio da MonoRail ad ASP.NET MVC 2.0 mi è capitato di dover gestire una serie di link esterni che richiamavano pagine del sito sui quali non avevo controllo e che ovviamente utilizzavano l’estensione “.rails” tipica di MonoRail. Visto che i nomi di controller ed action erano rimasti comunque invariati ho pensato di utilizzare il sistema di routing di ASP.NET.

Una delle caratteristiche più interessanti del routing di ASP.NET è la possibilità di specificare dei constraint nella registrazione di una route attraverso implementazione di IRouteConstraint. Il ruolo del constraint è quello di definire la validità della regola per la richiesta corrente. Il primo passo da compiere sarà quindi quello di definire un constraint che ci permetta di escludere dai nostri routing le richieste con estensione “.rails”. Qui sotto possiamo vedere nel dettaglio il codice:

Nel metodo di registrazione delle regole di routing nel Global.asax aggiungiamo alle regola già configurate la constraint per le action che contengono la stringa “.rails” e definiamo una nuova regola che invece le consideri. Qui sotto possiamo vedere un esempio di configurazione, attenzione però che se abbiamo ulteriori regole dobbiamo valutare di volta in volta se aggiungere il constraint in base al fatto che queste regole eseguano il match con le chiamate alle pagine di MonoRail.

/ Read Article /
by in / ASP.NET
1 people think this is good

ASP.NET MVC: Passaggio di parametri ad una action tramite RouteData

Immaginiamo di voler chiamare una action di un controller ASP.NET MVC passando una serie di parametri. Normalmente attraverso la chiamata a RedirectToAction utilizziamo un anonymous type, ma la precondizione è di conoscere il nome dei parametri da passare.
Nel caso in oggetto però noi non conosciamo a priori il nome dei parametri, come possiamo fare? In questa circostanza possiamo utilizzare la proprietà RouteData della classe Controller e precisamente la sua proprietà Values, un dizionario che contiene tutti i valori della richiesta:

/ Read Article /
by in / ASP.NET / Eventi
No peoples think this is good

Model View Controller: slide e demo disponibili per il download

Per chi fosse interessato sono disponibili per il download le slide e la demo dell’evento di giovedì scorso organizzato da 1nn0va sul Model View Controller. Nella demo i progetti di esempio con il confronto tra WebForms, ASP.NET MVC e MonoRail.

Per scaricare i file cliccare sui link qui sotto:

/ Read Article /
by in / ASP.NET
No peoples think this is good

Dynamic Data: attributo DisplayColumn e override di ToString()

Nei Dynamic Data quando abbiamo una relazione uno a molti possiamo utilizzare l’attributo DisplayColumn per determinare quale tra le proprietà della classe sulla parte uno della relazione viene utilizzata nel testo del link.

Analizzando nel dettaglio il controllo ForeignKey.ascx che visualizza il campo chiave esterna notiamo che il testo del link viene popolato utilizzando il metodo GetDisplayString della classe MetaTable. Utilizzando Reflector vediamo come si comporta questo metodo:

Dall’analisi del codice notiamo come l’attributo DisplayColumn non abbia effetto se abbiamo eseguito l’override del metodo ToString() nella classe della chiave esterna.

In questo modo se nella classe Customer dell’esempio andiamo ad eseguire l’override del metodo ToString() nel seguente modo…

… l’effetto che otteniamo è il seguente:

DisplayColumn

Ovviamente possiamo ovviare a questo comportamento modificando opportunamente il controllo ForeignKey affinché utilizzi direttamente l’attributo DisplayColumn.

/ Read Article /
by in / ASP.NET
No peoples think this is good

Passaggio di parametri ad un dynamic data control tramite l’attributo UIHint

Nei Dynamic Data possiamo, attraverso l’attributo UIHint, impostare il FieldTemplate da utilizzare per un determinato campo dati, e non solo, tramite la proprietà ControlParameters possiamo passare delle informazioni ai controlli, per esempio per impostarne delle proprietà. Vediamo come:

La proprietà ControlParameters è un insieme di coppie chiave/valore che possiamo popolare direttamente nella decorazione del campo nella classe dei metadati intervallando chiavi e valori separati da una virgola:

Nell’esempio sopra utilizziamo per il campo ContactName il template Text al quale passiamo una coppia chiave/valore con la quale vogliamo impostare la lunghezza della TextBox a 75 colonne.

Nel FieldTemplate andiamo ad intercettare l’evento PreRender e ciclando sulla collezione dei parametri utilizziamo la chiave per ottenere la proprietà corrispondente per il controllo TextBox esposto dalla proprietà DataControl. A questo punto assegnamo alla proprietà il valore utilizzando l’opportuno convertitore ottenuto dal tipo attraverso la classe TypeDescriptor.

In questo esempio ho utilizzato il FieldTemplate Text_Edit.ascx, ma se vogliamo estendere tale funzionalità a tutti i controlli possiamo pensare di creare una nostra classe che erediti direttamente da FieldTemplateUserControl ed inserire questo codice nell’override del metodo OnPreRender. Ovviamente questo implica (per questa soluzione) che le proprietà impostate nella ControlParameters vengano propagate per tutti i controlli utilizzati per renderizzare i dati del campo così decorato (ad esempio Text.ascx, Text_Edit.ascx e se esiste Text_Insert.ascx).

/ Read Article /
by in / ASP.NET
No peoples think this is good

Upload di file via HTTP POST in ASP.NET

In una applicazione web ASP.NET un file viene normalmente caricato via HTTP POST attraverso un HtmlInputFile con runat=”server” oppure tramite la sua controparte server FileUpload (introdotto con la versione 2.0 del .NET Framework). Lato code-behind si accede poi al file tramite la proprietà PostedFile identica per entrambi i controlli.
Se non abbiamo a disposizione una pagina web con i controlli sopra citati, ma la richiesta ci arriva da un applicazione esterna che utilizza ad esempio l’API Windows Internet (WinINet), dobbiamo leggere i dati direttamente dalla Request e precisamente dalla proprietà Files. Ecco come fare:

/ Read Article /