Posts by tag: mvc

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 / 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 / Castle Project
No peoples think this is good

Monorail & NVelocity: primo e ultimo elemento di un ciclo foreach

Può capitare alle volte di voler distinguere l’output di un foreach per il primo oppure l’ultimo elemento del ciclo, per fare questo in MonoRail il view engine NVelocity ci mette a disposizione la variabile $velocityCount che possiamo utilizzare nel seguente modo:

Fonte: Just in ram

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

Impostare la pagina di default con MonoRail Routing HttpModule

Oggi ho avuto l’occasione di utilizzare il Routing di MonoRail per risolvere un problema da tempo in sospeso, ovvero chiamare l’action di default quando nell’indirizzo viene specificato solo il nome del controller. Ad esempio se digitiamo mysite.com/admin MonoRail deve essere in grado di richiamare mysite.com/admin/default.rails.
La prima cosa da fare è creare nella root del sito la cartella admin con all’interno una pagina Default.aspx senza code-behind. In questo modo ASP.NET riscriverà la chiamata a mysite.com/admin con l’indirizzo mysite.com/admin/Default.aspx. In secondo luogo dobbiamo registrare nel web.config l’HttpModule di Routing:

A questo punto possiamo dichiarare delle regole di routing specificando con le regular expression quali indirizzi considerare e come eseguirne la riscrittura:

Nell’esempio sono state registrare due regole, nella prima vengono considerati tutti gli indirizzi che iniziano con il carattere / seguito da almeno un carattere alfanumerico e che terminano con un carattere / e la stringa Default.aspx, questi indirizzi vengono riscritti prendendo la parte prima del Default.aspx aggiungendovi /default.rails. La seconda regola invece ci permette di intercettare le chiamate alla pagina Default.aspx che si trova nella root del sito e che con la logica della prima regola porterebbe ad un controller vuoto e di conseguenza ad una bella eccezione. In questo caso l’indirizzo viene sostituito con /home/default.rails.

Nota: Per utilizzare questa tecnica è necessario creare una Default.aspx con relativa cartella per ogni controller dell’applicazione o meglio per i controller che necessitano di una pagina di default.

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

ASP.NET MVC Framework

In casa Redmond questo è un periodo ricco di novità, e non solo per l’ultimo giorno di Bill Gates, Scott Guthrie in un suo recente post ha annunciato il rilascio in versione Community Technology Preview di nuove funzionalità per ASP.NET e .NET 3.5 con il nome di ASP.NET 3.5 Extensions. Tra le novità più attese introdotte da questa preview c’è il framework MVC (Model View Controller) per lo sviluppo di applicazioni web con ASP.NET.

Ecco alcuni link per approfondire l’argomento:

Infine l’MVCToolkit, una serie di Extension Methods  disegnati per rendere più facile la composizione delle View, per intenderci come fanno i controlli server con le WebForm.

/ Read Article /