SlideShare a Scribd company logo
1 of 50
ASP.NET MVC Best Practices Simone ChiarettaSolution Developer, Avanade http://codeclimber.net.nz Twitter: @simonech 21 Ottobre 2009
Thanks to the Sponsors
Who the hell am I? Simone Chiaretta Work for Avanade Italy Microsoft MVP ASP.NET Blogger – http://codeclimber.net.nz Founder of UGIALT.NET OpenSource developer Climber All Around Nice Guy
Agenda ASP.NET MVC Best Practices Would you like someone to tell you the final a movie before you watch it? 3
What ASP.NET MVC is? It’s an advanced session... You should already know 
Just in case The Controller asks the Model for data The request hits the controller Model 2 1 3 Controller Browser The Model gives the data back to the Controller The controller formats the data and passes them to the View View 4 5 The view renders the HTML that needs to be sent to the client 5
Controller
Delete “AccountController” Best Practice n° 1
1 – Delete “AccountController” You will probably never use these account management pages Keeping demo code in a production application is EVIL Delete it 
Isolate controllers from the external World Best Practice n° 2
2 - Isolate controllers from the outside World HttpContext Data Access classes Configuration management Logging Clock Etc…
2 - Isolate controllers from the outside World Not testable application Not flexible application
Use a IoC Container Best Practice n° 3
What’s Dependency Injection 13
What’s Dependency Injection BAD
What’s Dependency Injection BETTER
What’s Dependency Injection BUT
Inversion of Control With IoC
IoC inside ASP.NET MVC Extend ControllerFactory Many ControllerFactory ready available StructureMap Spring Unity Windsor Ninject ...
IoC inside ASP.NET MVC using Ninject v2 Global.asax inherits from NinjectHttpApplication Helper to configure all controllers: RegisterAllControllersIn(“assemblyName”);
Don’t use “Magic strings” Best Practice n° 4
Say NO to Magic Strings Never use ViewData[“key”] Always create a ViewModel for each View View must inherit from System.Web.Mvc.ViewPage<ListViewModel>
Build your own “personal” conventions Best Practice n° 5
Build your own “personal” conventions ASP.NET MVC is the base on which to build your own reference architecture Controllers (and views) inherint from your own base class
Pay attention to Verbs Best Practice n° 6
Pay attention to Verbs What happens when you refresh (or go back) after you submit a form? 25
PRG Pattern View sends data in POST Controller validates Renders the View with errors (POST) Redirect in GET View renders the results in GET
Pay attention to Verbs Show data in GET Modify data in POST
Model
DomainModel != ViewModel Best Practice n° 7
DomainModel != ViewModel DomainModel Data + Behaviours hierarchical, complex types ViewModel Only Data Flat, only strings
DomainModel != ViewModel How to avoid getting bored writing tedious mapping code? AutoMapper Mapper.Map<Post, ShowPostModel>(post)
Use ActionFilter for “shared” data Best Practice n° 8
Components in ASP.NET MVC RenderPartial The Controller must “create” all data needed by all the partials RenderAction (futures) Smells (view calls a controller) More difficult to test Custom HtmlHelpers Ok for some HTML, but must not have logic
Action Filtes Defined as Attributi Allow you to execute “code” During the Autenthorization phase If an exception occurs Before an Action After an Action Before the rendering of a view After the rendering of a view “Core” filters Authorize OutputCache
Action Filter + Render Partial Controller: Has code for his “main concern” and “create” the main data View: Renders the main output Calls the various PartialViews Action Filters: Load data for the partial views Partial views Render data loaded via Action Filters
View
Do NOT use code-behind Best Practice n° 9
Do NOT use code-behind NEVER
Write HTML when you can Best Practice n° 10
Write HTML when you can You MUST learn HTML Do never use HtmlHelpers that ONLY abstract HTML awat <%= Html.Submit(“Salva”) %> vs <input type=“submit” value=“Salva” />
If there is an if, write an HtmlHelper Best Practice n° 11
If there is an if, write an HtmlHelper View must not have logic Allowed: if - foreach When possible, “hides” them in HtmlHelpers
Choose your View Engine carefully Best Practice n° 12
Choose your View Engine carefully The default is WebFormViewEngine Not the best available Choose the one that most suits you
Choose your View Engine carefully Spark View Engine The flow is managed by HTML It’s a templating engine Other Features Renders PDF Evaluates templates also with Javascript
Beginning ASP.NET MVC Simone Chiaretta & Keyvan Nayyeri TOC: MVC Testing And more... http://bit.ly/BeginningASPNETMVC
Contacts – Simone Chiaretta MSN: simone_ch@hotmail.com Blog: English: http://codeclimber.net.nz/ Italian: http://blogs.ugidotnet.org/piyo/ Twitter: @simonech 47
Credits These talk has been inspired by Sebastien Lambla (founder of Caffeine IT) and his ASP.NET MVC Best Practices Watch his talk (which is way better than mine): http://serialseb.blogspot.com/2009/05/my-mvc-best-practices-talk.html Read his blog: http://serialseb.blogspot.com/ 48
Q&A 49

More Related Content

Viewers also liked

Seeking Information On Vihan Direct Selling (QNET) From Karnataka Government
Seeking Information On Vihan Direct Selling (QNET) From Karnataka GovernmentSeeking Information On Vihan Direct Selling (QNET) From Karnataka Government
Seeking Information On Vihan Direct Selling (QNET) From Karnataka GovernmentSiddhartha Mukherjee
 
Algonquin Field Placement class - Guest Lecture Oct 31, 2014
Algonquin Field Placement class - Guest Lecture Oct 31, 2014Algonquin Field Placement class - Guest Lecture Oct 31, 2014
Algonquin Field Placement class - Guest Lecture Oct 31, 2014Alexandra Yarrow
 
Rti reply of government for network marketing company
Rti reply of government for network marketing companyRti reply of government for network marketing company
Rti reply of government for network marketing companySiddhartha Mukherjee
 
Contratos Convênios e Licitação
Contratos Convênios e LicitaçãoContratos Convênios e Licitação
Contratos Convênios e LicitaçãoNina Snape
 
Introduction to Garbage Collection
Introduction to Garbage CollectionIntroduction to Garbage Collection
Introduction to Garbage CollectionArtur Mkrtchyan
 
Rescuing a failing project
Rescuing a failing projectRescuing a failing project
Rescuing a failing projectMaksym Markov
 
Readers' advisory 2.0 / Suggestions de lecture 2.0
Readers' advisory 2.0 / Suggestions de lecture 2.0Readers' advisory 2.0 / Suggestions de lecture 2.0
Readers' advisory 2.0 / Suggestions de lecture 2.0Alexandra Yarrow
 
Huawei GGSN 9811 software management
Huawei GGSN 9811 software managementHuawei GGSN 9811 software management
Huawei GGSN 9811 software managementMario Gordon
 
Huawei GGSN 9811 hardware and software
Huawei GGSN 9811 hardware and software Huawei GGSN 9811 hardware and software
Huawei GGSN 9811 hardware and software Mario Gordon
 

Viewers also liked (10)

Seeking Information On Vihan Direct Selling (QNET) From Karnataka Government
Seeking Information On Vihan Direct Selling (QNET) From Karnataka GovernmentSeeking Information On Vihan Direct Selling (QNET) From Karnataka Government
Seeking Information On Vihan Direct Selling (QNET) From Karnataka Government
 
Algonquin Field Placement class - Guest Lecture Oct 31, 2014
Algonquin Field Placement class - Guest Lecture Oct 31, 2014Algonquin Field Placement class - Guest Lecture Oct 31, 2014
Algonquin Field Placement class - Guest Lecture Oct 31, 2014
 
Rti reply of government for network marketing company
Rti reply of government for network marketing companyRti reply of government for network marketing company
Rti reply of government for network marketing company
 
Contratos Convênios e Licitação
Contratos Convênios e LicitaçãoContratos Convênios e Licitação
Contratos Convênios e Licitação
 
Introduction to Garbage Collection
Introduction to Garbage CollectionIntroduction to Garbage Collection
Introduction to Garbage Collection
 
Ashihs
AshihsAshihs
Ashihs
 
Rescuing a failing project
Rescuing a failing projectRescuing a failing project
Rescuing a failing project
 
Readers' advisory 2.0 / Suggestions de lecture 2.0
Readers' advisory 2.0 / Suggestions de lecture 2.0Readers' advisory 2.0 / Suggestions de lecture 2.0
Readers' advisory 2.0 / Suggestions de lecture 2.0
 
Huawei GGSN 9811 software management
Huawei GGSN 9811 software managementHuawei GGSN 9811 software management
Huawei GGSN 9811 software management
 
Huawei GGSN 9811 hardware and software
Huawei GGSN 9811 hardware and software Huawei GGSN 9811 hardware and software
Huawei GGSN 9811 hardware and software
 

A S P N E T M V C Framework Best Practices E N G

  • 1. ASP.NET MVC Best Practices Simone ChiarettaSolution Developer, Avanade http://codeclimber.net.nz Twitter: @simonech 21 Ottobre 2009
  • 2. Thanks to the Sponsors
  • 3. Who the hell am I? Simone Chiaretta Work for Avanade Italy Microsoft MVP ASP.NET Blogger – http://codeclimber.net.nz Founder of UGIALT.NET OpenSource developer Climber All Around Nice Guy
  • 4. Agenda ASP.NET MVC Best Practices Would you like someone to tell you the final a movie before you watch it? 3
  • 5. What ASP.NET MVC is? It’s an advanced session... You should already know 
  • 6. Just in case The Controller asks the Model for data The request hits the controller Model 2 1 3 Controller Browser The Model gives the data back to the Controller The controller formats the data and passes them to the View View 4 5 The view renders the HTML that needs to be sent to the client 5
  • 9. 1 – Delete “AccountController” You will probably never use these account management pages Keeping demo code in a production application is EVIL Delete it 
  • 10. Isolate controllers from the external World Best Practice n° 2
  • 11. 2 - Isolate controllers from the outside World HttpContext Data Access classes Configuration management Logging Clock Etc…
  • 12. 2 - Isolate controllers from the outside World Not testable application Not flexible application
  • 13. Use a IoC Container Best Practice n° 3
  • 19. IoC inside ASP.NET MVC Extend ControllerFactory Many ControllerFactory ready available StructureMap Spring Unity Windsor Ninject ...
  • 20. IoC inside ASP.NET MVC using Ninject v2 Global.asax inherits from NinjectHttpApplication Helper to configure all controllers: RegisterAllControllersIn(“assemblyName”);
  • 21. Don’t use “Magic strings” Best Practice n° 4
  • 22. Say NO to Magic Strings Never use ViewData[“key”] Always create a ViewModel for each View View must inherit from System.Web.Mvc.ViewPage<ListViewModel>
  • 23. Build your own “personal” conventions Best Practice n° 5
  • 24. Build your own “personal” conventions ASP.NET MVC is the base on which to build your own reference architecture Controllers (and views) inherint from your own base class
  • 25. Pay attention to Verbs Best Practice n° 6
  • 26. Pay attention to Verbs What happens when you refresh (or go back) after you submit a form? 25
  • 27. PRG Pattern View sends data in POST Controller validates Renders the View with errors (POST) Redirect in GET View renders the results in GET
  • 28. Pay attention to Verbs Show data in GET Modify data in POST
  • 29. Model
  • 30. DomainModel != ViewModel Best Practice n° 7
  • 31. DomainModel != ViewModel DomainModel Data + Behaviours hierarchical, complex types ViewModel Only Data Flat, only strings
  • 32. DomainModel != ViewModel How to avoid getting bored writing tedious mapping code? AutoMapper Mapper.Map<Post, ShowPostModel>(post)
  • 33. Use ActionFilter for “shared” data Best Practice n° 8
  • 34. Components in ASP.NET MVC RenderPartial The Controller must “create” all data needed by all the partials RenderAction (futures) Smells (view calls a controller) More difficult to test Custom HtmlHelpers Ok for some HTML, but must not have logic
  • 35. Action Filtes Defined as Attributi Allow you to execute “code” During the Autenthorization phase If an exception occurs Before an Action After an Action Before the rendering of a view After the rendering of a view “Core” filters Authorize OutputCache
  • 36. Action Filter + Render Partial Controller: Has code for his “main concern” and “create” the main data View: Renders the main output Calls the various PartialViews Action Filters: Load data for the partial views Partial views Render data loaded via Action Filters
  • 37. View
  • 38. Do NOT use code-behind Best Practice n° 9
  • 39. Do NOT use code-behind NEVER
  • 40. Write HTML when you can Best Practice n° 10
  • 41. Write HTML when you can You MUST learn HTML Do never use HtmlHelpers that ONLY abstract HTML awat <%= Html.Submit(“Salva”) %> vs <input type=“submit” value=“Salva” />
  • 42. If there is an if, write an HtmlHelper Best Practice n° 11
  • 43. If there is an if, write an HtmlHelper View must not have logic Allowed: if - foreach When possible, “hides” them in HtmlHelpers
  • 44. Choose your View Engine carefully Best Practice n° 12
  • 45. Choose your View Engine carefully The default is WebFormViewEngine Not the best available Choose the one that most suits you
  • 46. Choose your View Engine carefully Spark View Engine The flow is managed by HTML It’s a templating engine Other Features Renders PDF Evaluates templates also with Javascript
  • 47. Beginning ASP.NET MVC Simone Chiaretta & Keyvan Nayyeri TOC: MVC Testing And more... http://bit.ly/BeginningASPNETMVC
  • 48. Contacts – Simone Chiaretta MSN: simone_ch@hotmail.com Blog: English: http://codeclimber.net.nz/ Italian: http://blogs.ugidotnet.org/piyo/ Twitter: @simonech 47
  • 49. Credits These talk has been inspired by Sebastien Lambla (founder of Caffeine IT) and his ASP.NET MVC Best Practices Watch his talk (which is way better than mine): http://serialseb.blogspot.com/2009/05/my-mvc-best-practices-talk.html Read his blog: http://serialseb.blogspot.com/ 48