Librinformatica

Newsletter

Libreria Gaia Scienza Edizioni Erasmo Edizioni del Boccale

Programmare Microsoft ASP.NET MVC con Microsoft Visual Studio 2010

Mondadori Informatica

Programmare Microsoft ASP.NET MVC con Microsoft Visual Studio 2010


90,00 € IVA compresa

Consigliato da Librinformatica

9788861142954

  • Volumi: 1
  • Data Pubblicazione: 03/2011
  • Lingua: italiano
  • Livello: Avanzato
  • Pagine: 569
  • Collana: Programming series
  • Editore Originale: Microsoft Press
  • Titolo Originale: Programming Microsoft ASP.NET MVC: Covers ASP.NET MVC 2 And Microsoft Visual Studio 2010
  • Autore: Dino Esposito

Scritto da Dino Esposito vera e propria autorità in materia di ASP.NET questo libro approfondisce le funzionalità, i principi e i pilastri del framework ASP.NET MVC. ASP.NET MVC costringe gli sviluppatori a riflettere in termini di componenti distinti (Model, View e Controller) che rendono più facile gestire la complessità dell'applicazione, pur permettendo un rigido controllo sul markup.

Una guida per tuffarsi nel meccanismo interno del framework e acquisire la prospettiva su come utilizzare questo modello di programmazione verso i Web Forms, e iniziare a costruire rapidamente le proprie applicazioni MVC.


L'autore

Dino Esposito è un noto esperto di ASP.NET, AJAX e Microsoft Silverlight® che ha scritto, come autore o coautore, diversi libri molto popolari, compresi Programmare ASP.NET 3.5, Microsoft ASP.NET and AJAX: Architecting Web Applications e Microsoft .NET: Architecting Applications for the Enterprise. E' un assiduo collaboratore di MSDN® Magazine e interviene come speaker agli eventi di settore come DevConnections e Microsoft TechEd.

Sommario

Ringraziamenti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xv

Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xvii



Parte I Il paradigma di programmazione



1 Obiettivi di ASP.NET MVC e motivazione

del suo sviluppo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

Il profondo impatto di ASP.NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

La produttività è regina . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

Il modello Web Forms. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

Il pattern Page Controller. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

L’età della ragione di ASP.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

I segni di vecchiaia di ASP.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

Il punto di svolta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20

Un’occhiata a ASP.NET MVC. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26

Punti salienti di ASP.NET MVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26

Web Forms vs. ASP.NET MVC. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30

In sintesi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35



2 L’ambiente runtime. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37

Il meccanismo runtime di ASP.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37

ASP.NET e il Web server IIS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38

Ciclo di vita di una richiesta ASP.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44

Cos’è dunque un handler HTTP? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51

Cos’è dunque un modulo HTTP?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57

Instradamento dell’URL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61

La shell run-time di ASP.NET MVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67

Il quadro generale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68

Elaborazione di una richiesta ASP.NET MVC. . . . . . . . . . . . . . . . . . . . . . . . 75

In sintesi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80



3 Il pattern MVC e oltre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .81

Il pattern MVC originale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82

Modello di interazione MVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82

L’idea originale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83

Presentazione degli attori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84

Limitazioni del pattern MVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89

Il pattern Model2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90

MVC e il Web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90

Model2 e ASP.NET MVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93

Variazioni di MVC orientate alla presentazione . . . . . . . . . . . . . . . . . . . . . . . . . . 98

Il pattern MVP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98

Il pattern Presentation Model (noto anche come MVVM) . . . . . . . . . . . 103

Il template di progetto ASP.NET MVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107

Peculiarità di un progetto ASP.NET MVC. . . . . . . . . . . . . . . . . . . . . . . . . . 108

Cartelle speciali ASP.NET MVC. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113

In sintesi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118



Parte II Fondamenti di ASP.NET MVC



4 I controller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123

Il ruolo dei controller e la motivazione del loro utilizzo . . . . . . . . . . . . . . . . . . 123

Oltre l’approccio code-behind . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124

Introduzione ai controller. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128

Meccanismo dei controller in ASP.NET MVC. . . . . . . . . . . . . . . . . . . . . . . 132

Anatomia di un controller ASP.NET MVC. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135

All’interno della struttura di un controller. . . . . . . . . . . . . . . . . . . . . . . . . 135

Comportamento di un controller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144

Attributi dei controller e dei metodi di azione . . . . . . . . . . . . . . . . . . . . . 156

Scrittura di un controller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167

Progettazione di una classe controller. . . . . . . . . . . . . . . . . . . . . . . . . . . . 167

Si dovrà utilizzare una propria classe base? . . . . . . . . . . . . . . . . . . . . . . . 176

Funzionalità speciali. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183

Raggruppamento dei controller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184

Controller asincroni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187

Azioni di rendering . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195

Controller e testabilità. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199

Rendere i controller facili da testare. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199

Scrittura degli unit test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204

In sintesi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209



5 Le visualizzazioni. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211

Visualizzazioni e controller. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212

Dai controller alle visualizzazioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212

Generazione della risposta per il browser . . . . . . . . . . . . . . . . . . . . . . . . . 213

Anatomia di una visualizzazione ASP.NET MVC . . . . . . . . . . . . . . . . . . . . . . . . . 215

Selezione della visualizzazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215

Creazione della visualizzazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220

Il motore di visualizzazione predefi nito. . . . . . . . . . . . . . . . . . . . . . . . . . . 222

Il motore di visualizzazione Web Forms . . . . . . . . . . . . . . . . . . . . . . . . . . 226

Scrittura di una visualizzazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233

Il template della visualizzazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235

Popolamento della visualizzazione. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241

Helper HTML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252

Helper HTML a template . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257

Datagrid e visualizzazioni paginate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261

Test di una visualizzazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273

In sintesi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275



6 I modelli . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277

Cos’è dunque il modello? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278

Quanti tipi di modelli conoscete? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278

La cartella Models . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282

Modello del dominio e view-model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286

Modellamento degli oggetti business . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286

Aggiunta della logica di validazione al modello . . . . . . . . . . . . . . . . . . . 291

Dati della visualizzazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299

Model Binding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305

Il model binder in azione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306

In sintesi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313



Parte III Funzionalità di programmazione



7 Immissione dati in ASP.NET MVC. . . . . . . . . . . . . . . . . . . . . . . . . . .317

Il pattern Select-Edit-Save . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318

Presentazione dei dati. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318

Modifi ca dei dati . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320

Salvataggio dei dati. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324

Validazione dei dati . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326

Validazione lato server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326

Fornire il feedback all’utente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334

Annotazioni dei dati e validatori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 342

Validazione lato client . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 351

In sintesi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354



8 L’infrastruttura ASP.NET MVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355

Routing. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 356

Gestire i route. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 356

Tenere d’occhio la SEO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 362

Gestione degli errori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 366

Fondamenti della gestione errori ASP.NET . . . . . . . . . . . . . . . . . . . . . . . . 366

Trattare il contenuto mancante. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 371

Localizzazione. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374

Rendere localizzabili le risorse. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374

Trattare le risorse in ASP.NET MVC. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 376

Iniezione delle dipendenze. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 382

Inversione delle dipendenze in azione. . . . . . . . . . . . . . . . . . . . . . . . . . . . 383

Un breve tour di Unity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 391

Creazione di un container globale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395

In sintesi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 399



9 Funzionalità AJAX. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 401

AJAX in ASP.NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 401

Rendering parziale. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 402

Direct Scripting. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 405

AJAX in ASP.NET MVC. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 408

La API JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 408

La façade del controller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 413

Helper AJAX in ASP.NET MVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 420

Rendering parziale in ASP.NET MVC. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 428

In sintesi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 432



10 Testabilità e unit testing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 435

Testabilità e design . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 436

Design for Testability . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 436

Rilassare il proprio design . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 438

Elementi di unit testing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 443

Lavorare con il test harness . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 443

Aspetti del testing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 447

Unit Testing in ASP.NET MVC. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 454

Test delle azioni dei controller. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 454

Sommario xiii

Iniezione di oggetti simulati e fi ttizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 458

Simulazione del contesto HTTP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 463

Test più specifi ci . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471

In sintesi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 475



11 Personalizzazione di ASP.NET MVC . . . . . . . . . . . . . . . . . . . . . . . 477

I factory dei controller. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 477

Elaborazione della richiesta ASP.NET MVC . . . . . . . . . . . . . . . . . . . . . . . . 478

Estendere il factory di controller di default. . . . . . . . . . . . . . . . . . . . . . . . 480

Invocazione di azioni. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 487

Filtri di azione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 496

Galleria di fi ltri di azione. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 496

Caricare dinamicamente i fi ltri di azione . . . . . . . . . . . . . . . . . . . . . . . . . . 505

Selettori di azione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 509

Risultati di azione e rendering . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 512

Elaborazione del risultato dell’azione. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 512

Oggetti ActionResult personalizzati . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 514

I motori di visualizzazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 521

Helper HTML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 529

In sintesi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 538

Appendice: ReSharper e la potenza dei tool . . . . . . . . . . . . . . . . . . . 539

Estensioni IntelliSense . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 539

Scegliere il nome corretto della visualizzazione con i suggerimenti

IntelliSense . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 540

Action link e URL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 541

Controlli utente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 542

Analisi statica per rilevare visualizzazioni e azioni mancanti . . . . . . . . . . . . . . 542

Assistenti alla codifi ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 543

Creazione di visualizzazioni in base all’utilizzo. . . . . . . . . . . . . . . . . . . . . 543

Navigazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 545

Navigazione tra controller e visualizzazione. . . . . . . . . . . . . . . . . . . . . . . 545

Individuazione di simboli . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 547

Navigazione all’interno di pagine master e di contenuto. . . . . . . . . . . . 547

Refactoring per ASP.NET MVC. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 548

Conclusioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 549



Indice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 551

Carrello

Non ci sono prodotti

Spedizione 0,00 €
Totale 0,00 €

Carrello Acquista