SlideShare a Scribd company logo
 
Introducing the ASP.NET MVC framework Maarten  Balliauw –  Real Dolmen Website:  www.realdolmen.com   E-mail:  [email_address]   Blog:  http://blog.maartenballiauw.be
AGENDA MVC ASP.NET MVC Hello world! Routing Extensibility Testing …
MVC – MODEL-VIEW-CONTROLLER Design pattern Isolating business logic from UI Maintainability Layering for UI layer
ASP.NET MVC A new  option  for ASP.NET Simpler  way to program ASP.NET Easily  testable  and TDD friendly More control over your <html/> More control over your URLs Not for everyone! (car vs. motorcycle) Not a replacement for webforms! Supports existing ASP.NET features
WHAT YOU WILL LOSE… Viewstate Postbacks Tricky interview questions about nuances of the page lifecycle
HOW IT WORKS… Browser Web Server http://myserver.com/Products/Edit/5 http://myserver.com/Products/
INTERACTIONS /Products/Edit/5 ProductsController (Controller) /Products/Update/5 URL:
DEMO Hello World
WHAT’S THE POINT? It’s not WebForms 4.0! It’s an  alternative Flexible Extendible in each part of the process Fundamental Only System.Web!  (Not WPF or Winforms) Plays well with others NHibernate for models, NVelocity for views, Unity for dependency injection, … Keep things simple!
GOALS Maintain Clean Separation of Concerns Easy Testing  Red/Green TDD  Highly maintainable applications by default Extensible and Pluggable Support replacing any component of system Source available on CodePlex Not open source Build your own, private version
DRIVING GOALS Enable clean URLs and SEO SEO friendly URL structures Great ASP.NET integration All providers are supported Membership, Caching, Session, … ASP.NET designer in VS2008 Check my blog! http://tinyurl.com/maarten-outputcache http://tinyurl.com/maarten-mvcsitemap
REQUEST LIFECYCLE Browser requests /Products/ Route is determined Controller is activated Method on Controller is invoked Controller does some stuff Renders View, passing in ViewData
ACTUALLY, THERE’S MORE… You can replace each step of the process!
DEMO Request lifecycle
ROUTING – PRETTY URLS Developer adds Routes to a global RouteTable Mapping creates RouteData – a bag of key/values This is  NOT  URL rewriting! It’s more! public static void RegisterRoutes(RouteCollection routes) {   routes.MapRoute( &quot;Default &quot;{controller}/{action}/{id}&quot;,  new { controller = &quot;Home&quot;, action = &quot;Index&quot;, id = &quot;&quot; }, new { controller = @&quot;[^\.]*&quot; } ); }
CUSTOM URL ROUTING Can setup custom URL routing rules within the RegisterRoutes() method in Global.asax Enables very flexible mapping and route rules: Default parameters Constraints Named routes Wildcard “catch-all” routes
DEMO Routing
EXTENSIBILITY These are all pluggable! Views Controllers Models Routes Check my blog! http://tinyurl.com/maarten-mvccustomviewengine MvcContrib http://www.codeplex.com/MvcContrib
VIEWENGINE, VIEW View engines instantiate views Views render output You get WebForms by default Can implement your own MvcContrib has them for Brail, NHaml, NVelocity, … Customizing these can be used to Offer new DSLs to make HTML easier Generate totally different mime/types Images, RSS, JSON, XML, OFX, VCards, DOCX, whatever public abstract class VirtualPathProviderViewEngine : IViewEngine { protected abstract IView CreatePartialView(...); protected abstract IView CreateView(…); } public interface IView { void Render(ViewContext viewContext, TextWriter writer); }
NHAML – FROM… <%@ Page Language=&quot;C#&quot; MasterPageFile=&quot;~/Views/Shared/Site.Master&quot; AutoEventWireup=&quot;true&quot;  CodeBehind=&quot;List.aspx&quot; Inherits=&quot;MvcApplication5.Views.Products.List&quot; Title=&quot;Products&quot; %> <asp:Content ContentPlaceHolderID=&quot;MainContentPlaceHolder&quot; runat=&quot;server&quot;> <h2><%= ViewData.CategoryName %></h2> <ul> <% foreach (var product in ViewData.Products) { %> <li> <%= product.ProductName %>  <div class=&quot;editlink&quot;> (<%= Html.ActionLink(&quot;Edit&quot;, new { Action=&quot;Edit&quot;, ID=product.ProductID })%>) </div> </li> <% } %> </ul> <%= Html.ActionLink(&quot;Add New Product&quot;, new { Action=&quot;New&quot; }) %> </asp:Content>
NHAML – TO… http://code.google.com/p/nhaml/ %h2= ViewData.CategoryName  %ul  - foreach (var product in ViewData.Products)   %li = product.ProductName    .editlink   = Html.ActionLink(&quot;Edit&quot;,    new { Action=&quot;Edit&quot;,    ID=product.ProductID })    = Html.ActionLink(&quot;Add New Product&quot;,    new { Action=&quot;New&quot; })
SPARK – FROM… <%@ Page Language=&quot;C#&quot; MasterPageFile=&quot;~/Views/Shared/Site.Master&quot; AutoEventWireup=&quot;true&quot;  CodeBehind=&quot;List.aspx&quot; Inherits=&quot;MvcApplication5.Views.Products.List&quot; Title=&quot;Products&quot; %> <asp:Content ContentPlaceHolderID=&quot;MainContentPlaceHolder&quot; runat=&quot;server&quot;> <h2><%= ViewData.CategoryName %></h2> <ul> <% foreach (var product in ViewData.Products) { %> <li> <%= product.ProductName %>  <div class=&quot;editlink&quot;> (<%= Html.ActionLink(&quot;Edit&quot;, new { Action=&quot;Edit&quot;, ID=product.ProductID })%>) </div> </li> <% } %> </ul> <%= Html.ActionLink(&quot;Add New Product&quot;, new { Action=&quot;New&quot; }) %> </asp:Content>
SPARK – TO… http://dev.dejardin.org/ <viewdata model=&quot;MvcApplication5.Models.Product“/> <h2>${ViewData.CategoryName}</h2> <ul>   <for each=&quot;var product in ViewData.Products&quot;>   <li> ${product.ProductName}   <div class=&quot;editlink&quot;>   (<a href=&quot;/Products/Edit/${product.ProductID}&quot;>Edit</a>)   </div> </li> </for> </ul> <a href=&quot;/Products/New&quot;>Add New Product</a>
FILTER ATTRIBUTES Enable custom behavior to be added to Controllers and Controller actions 4 types Authentication filter Action filter Result filter Exception filter Examples: [Authorize], [LogAction], [OutputCache], … http://tinyurl.com/maarten-outputcache
DEMO Filter attributes
TESTING Has anyone tried testing webforms? Without IIS being fired up? Each component tested individually?
INTERFACES AND TESTING These are all easily mockable! HttpContextBase, HttpResponseBase, HttpRequestBase Extensibility  IController IControllerFactory IRouteHandler IViewEngine
TESTING CONTROLLER ACTIONS No requirement to test within ASP.NET runtime! Can mock parts of runtime you want to fake Using Moq, Rhino, TypeMock, … http://code.google.com/p/moq/ [TestMethod] public void ShowPostsDisplayPostView()  { BlogController controller = new BlogController(…); var result = controller.ShowPost(2) as ViewResult; Assert.IsNotNull(result); Assert.AreEqual(result.ViewData[ &quot; Message &quot; ],  &quot; Hello &quot; ); }
TESTING CONTROLLER ACTIONS USING MOQ [TestMethod] public void TestInvalidCredentials() { LoginController controller = new LoginController(); var mock = new Mock<System.Web.Security.MembershipProvider>(); mock.Expect(m => m.ValidateUser(&quot;&quot;, &quot;&quot;)).Returns(false); controller.MembershipProviderInstance = mock.Object; var result = controller.Authenticate(&quot;&quot;, &quot;&quot;) as ViewResult; Assert.IsNotNull(result); Assert.AreEqual(result.ViewName, &quot;Index&quot;); Assert.AreEqual(controller.ViewData[&quot;ErrorMessage&quot;], &quot;Invalid credentials! Please verify your username and password.&quot;); }
TESTING FRAMEWORKS Any framework is supported! Visual Studio Test NUnit XUnit …
DEMO Testing
DEMO A complete application!
SUMMARY A new option for ASP.NET. More control over your <html/> and URLs More easily testable approach Not for everyone – only use it if you want to Shipping later this year
COMMON QUESTIONS Should I use WebForms or MVC? Are there any controls? Do I have to write <%= %> code in my view? What about AJAX? How fast/scalable is it? Is it safe? When will it ship?
QUESTIONS?
THANK YOU! Make sure to check http://blog.maartenballiauw.be/category/MVC.aspx

More Related Content

What's hot (20)

Usability in the GeoWeb
Usability in the GeoWeb
Dave Bouwman
 
Introduction to angular js for .net developers
Introduction to angular js for .net developers
Mohd Manzoor Ahmed
 
Testing C# and ASP.net using Ruby
Testing C# and ASP.net using Ruby
Ben Hall
 
Angularjs Live Project
Angularjs Live Project
Mohd Manzoor Ahmed
 
Web driver selenium simplified
Web driver selenium simplified
Vikas Singh
 
Fullstack End-to-end test automation with Node.js, one year later
Fullstack End-to-end test automation with Node.js, one year later
Mek Srunyu Stittri
 
Laravel mail example how to send an email using markdown template in laravel 8
Laravel mail example how to send an email using markdown template in laravel 8
Katy Slemon
 
Introduction to Using PHP & MVC Frameworks
Introduction to Using PHP & MVC Frameworks
Gerald Krishnan
 
JavaFX Advanced
JavaFX Advanced
Paul Bakker
 
Rey Bango - HTML5: polyfills and shims
Rey Bango - HTML5: polyfills and shims
StarTech Conference
 
Node.js and Selenium Webdriver, a journey from the Java side
Node.js and Selenium Webdriver, a journey from the Java side
Mek Srunyu Stittri
 
Migrating from JSF1 to JSF2
Migrating from JSF1 to JSF2
tahirraza
 
JavaFX in Action (devoxx'16)
JavaFX in Action (devoxx'16)
Alexander Casall
 
API Technical Writing
API Technical Writing
Sarah Maddox
 
OSDC 2009 Rails Turtorial
OSDC 2009 Rails Turtorial
Yi-Ting Cheng
 
Add even richer interaction to your site - plone.patternslib
Add even richer interaction to your site - plone.patternslib
Wolfgang Thomas
 
Beginning AngularJS
Beginning AngularJS
Troy Miles
 
Perlbal Tutorial
Perlbal Tutorial
Takatsugu Shigeta
 
A tech writer, a map, and an app
A tech writer, a map, and an app
Sarah Maddox
 
What's new and exciting with JSF 2.0
What's new and exciting with JSF 2.0
Michael Fons
 
Usability in the GeoWeb
Usability in the GeoWeb
Dave Bouwman
 
Introduction to angular js for .net developers
Introduction to angular js for .net developers
Mohd Manzoor Ahmed
 
Testing C# and ASP.net using Ruby
Testing C# and ASP.net using Ruby
Ben Hall
 
Web driver selenium simplified
Web driver selenium simplified
Vikas Singh
 
Fullstack End-to-end test automation with Node.js, one year later
Fullstack End-to-end test automation with Node.js, one year later
Mek Srunyu Stittri
 
Laravel mail example how to send an email using markdown template in laravel 8
Laravel mail example how to send an email using markdown template in laravel 8
Katy Slemon
 
Introduction to Using PHP & MVC Frameworks
Introduction to Using PHP & MVC Frameworks
Gerald Krishnan
 
Rey Bango - HTML5: polyfills and shims
Rey Bango - HTML5: polyfills and shims
StarTech Conference
 
Node.js and Selenium Webdriver, a journey from the Java side
Node.js and Selenium Webdriver, a journey from the Java side
Mek Srunyu Stittri
 
Migrating from JSF1 to JSF2
Migrating from JSF1 to JSF2
tahirraza
 
JavaFX in Action (devoxx'16)
JavaFX in Action (devoxx'16)
Alexander Casall
 
API Technical Writing
API Technical Writing
Sarah Maddox
 
OSDC 2009 Rails Turtorial
OSDC 2009 Rails Turtorial
Yi-Ting Cheng
 
Add even richer interaction to your site - plone.patternslib
Add even richer interaction to your site - plone.patternslib
Wolfgang Thomas
 
Beginning AngularJS
Beginning AngularJS
Troy Miles
 
A tech writer, a map, and an app
A tech writer, a map, and an app
Sarah Maddox
 
What's new and exciting with JSF 2.0
What's new and exciting with JSF 2.0
Michael Fons
 

Viewers also liked (20)

ASP.NET MVC Wisdom
ASP.NET MVC Wisdom
Maarten Balliauw
 
Just another Wordpress weblog, but more cloudy
Just another Wordpress weblog, but more cloudy
Maarten Balliauw
 
Mocking - Visug session
Mocking - Visug session
Maarten Balliauw
 
AZUG.BE - Azure User Group Belgium - First public meeting
AZUG.BE - Azure User Group Belgium - First public meeting
Maarten Balliauw
 
PHP And Silverlight - DevDays session
PHP And Silverlight - DevDays session
Maarten Balliauw
 
PHPExcel
PHPExcel
Maarten Balliauw
 
MSDN - Converting an existing ASP.NET application to Windows Azure
MSDN - Converting an existing ASP.NET application to Windows Azure
Maarten Balliauw
 
Presentation Thesis Big Data
Presentation Thesis Big Data
Natan Meekers
 
MSDN - ASP.NET MVC
MSDN - ASP.NET MVC
Maarten Balliauw
 
Bài 6 an toàn hệ thống máy tính
Bài 6 an toàn hệ thống máy tính
MasterCode.vn
 
Bài 3: Lập trình giao diện điều khiển & Xử lý sự kiện - Lập trình winform - G...
Bài 3: Lập trình giao diện điều khiển & Xử lý sự kiện - Lập trình winform - G...
MasterCode.vn
 
Bài 5: Làm quen với lập trình CSDL ASP.NET - Giáo trình FPT - Có ví dụ kèm theo
Bài 5: Làm quen với lập trình CSDL ASP.NET - Giáo trình FPT - Có ví dụ kèm theo
MasterCode.vn
 
Bài 7: Lập trình với CSDL – Sử dụng DESIGNER & Triển khai ứng dụng - Lập trìn...
Bài 7: Lập trình với CSDL – Sử dụng DESIGNER & Triển khai ứng dụng - Lập trìn...
MasterCode.vn
 
Bài 4: Lập trình với CSDL ADO.NET & Kiến trúc không kết nối & Lập trình giao ...
Bài 4: Lập trình với CSDL ADO.NET & Kiến trúc không kết nối & Lập trình giao ...
MasterCode.vn
 
Bài 6: Điều khiển DetailsView, FormView, ListView, DataPager
Bài 6: Điều khiển DetailsView, FormView, ListView, DataPager
MasterCode.vn
 
Bài 1 - Làm quen với C# - Lập trình winform
Bài 1 - Làm quen với C# - Lập trình winform
MasterCode.vn
 
BÀI 2: Thiết kế FORM và xử lý sự kiện - Giáo trình FPT
BÀI 2: Thiết kế FORM và xử lý sự kiện - Giáo trình FPT
MasterCode.vn
 
Apache Hadoop YARN - Enabling Next Generation Data Applications
Apache Hadoop YARN - Enabling Next Generation Data Applications
Hortonworks
 
Lập trình ứng dụng web asp.net với C# - tailieumienphi.edu.vn
Lập trình ứng dụng web asp.net với C# - tailieumienphi.edu.vn
tailieumienphi
 
Lập trình sáng tạo creative computing textbook mastercode.vn
Lập trình sáng tạo creative computing textbook mastercode.vn
MasterCode.vn
 
Just another Wordpress weblog, but more cloudy
Just another Wordpress weblog, but more cloudy
Maarten Balliauw
 
AZUG.BE - Azure User Group Belgium - First public meeting
AZUG.BE - Azure User Group Belgium - First public meeting
Maarten Balliauw
 
PHP And Silverlight - DevDays session
PHP And Silverlight - DevDays session
Maarten Balliauw
 
MSDN - Converting an existing ASP.NET application to Windows Azure
MSDN - Converting an existing ASP.NET application to Windows Azure
Maarten Balliauw
 
Presentation Thesis Big Data
Presentation Thesis Big Data
Natan Meekers
 
Bài 6 an toàn hệ thống máy tính
Bài 6 an toàn hệ thống máy tính
MasterCode.vn
 
Bài 3: Lập trình giao diện điều khiển & Xử lý sự kiện - Lập trình winform - G...
Bài 3: Lập trình giao diện điều khiển & Xử lý sự kiện - Lập trình winform - G...
MasterCode.vn
 
Bài 5: Làm quen với lập trình CSDL ASP.NET - Giáo trình FPT - Có ví dụ kèm theo
Bài 5: Làm quen với lập trình CSDL ASP.NET - Giáo trình FPT - Có ví dụ kèm theo
MasterCode.vn
 
Bài 7: Lập trình với CSDL – Sử dụng DESIGNER & Triển khai ứng dụng - Lập trìn...
Bài 7: Lập trình với CSDL – Sử dụng DESIGNER & Triển khai ứng dụng - Lập trìn...
MasterCode.vn
 
Bài 4: Lập trình với CSDL ADO.NET & Kiến trúc không kết nối & Lập trình giao ...
Bài 4: Lập trình với CSDL ADO.NET & Kiến trúc không kết nối & Lập trình giao ...
MasterCode.vn
 
Bài 6: Điều khiển DetailsView, FormView, ListView, DataPager
Bài 6: Điều khiển DetailsView, FormView, ListView, DataPager
MasterCode.vn
 
Bài 1 - Làm quen với C# - Lập trình winform
Bài 1 - Làm quen với C# - Lập trình winform
MasterCode.vn
 
BÀI 2: Thiết kế FORM và xử lý sự kiện - Giáo trình FPT
BÀI 2: Thiết kế FORM và xử lý sự kiện - Giáo trình FPT
MasterCode.vn
 
Apache Hadoop YARN - Enabling Next Generation Data Applications
Apache Hadoop YARN - Enabling Next Generation Data Applications
Hortonworks
 
Lập trình ứng dụng web asp.net với C# - tailieumienphi.edu.vn
Lập trình ứng dụng web asp.net với C# - tailieumienphi.edu.vn
tailieumienphi
 
Lập trình sáng tạo creative computing textbook mastercode.vn
Lập trình sáng tạo creative computing textbook mastercode.vn
MasterCode.vn
 
Ad

Similar to Introduction to ASP.NET MVC (20)

CTTDNUG ASP.NET MVC
CTTDNUG ASP.NET MVC
Barry Gervin
 
ASP.NET MVC introduction
ASP.NET MVC introduction
Tomi Juhola
 
Introduction To Mvc
Introduction To Mvc
Volkan Uzun
 
Spring MVC
Spring MVC
yuvalb
 
ASP.NET MVC
ASP.NET MVC
Paul Stovell
 
Introduction To ASP.NET MVC
Introduction To ASP.NET MVC
Alan Dean
 
WebTest - Efficient Functional Web Testing with HtmlUnit and Beyond
WebTest - Efficient Functional Web Testing with HtmlUnit and Beyond
mguillem
 
Asp.Net MVC Intro
Asp.Net MVC Intro
Stefano Paluello
 
EPiServer Web Parts
EPiServer Web Parts
EPiServer Meetup Oslo
 
Introduction to ASP.NET MVC
Introduction to ASP.NET MVC
Sunpawet Somsin
 
ASP.NET MVC Presentation
ASP.NET MVC Presentation
ivpol
 
A Web Developer's Journey across different versions of ASP.NET
A Web Developer's Journey across different versions of ASP.NET
Harish Ranganathan
 
Asp.Net Mvc
Asp.Net Mvc
micham
 
You Know WebOS
You Know WebOS
360|Conferences
 
Asp.Net MVC Framework Design Pattern
Asp.Net MVC Framework Design Pattern
maddinapudi
 
Developing ASP.NET Applications Using the Model View Controller Pattern
Developing ASP.NET Applications Using the Model View Controller Pattern
goodfriday
 
MVC & SQL_In_1_Hour
MVC & SQL_In_1_Hour
Dilip Patel
 
Overview of MVC Framework - by software outsourcing company india
Overview of MVC Framework - by software outsourcing company india
Jignesh Aakoliya
 
Usability AJAX and other ASP.NET Features
Usability AJAX and other ASP.NET Features
Peter Gfader
 
ASP.net MVC CodeCamp Presentation
ASP.net MVC CodeCamp Presentation
buildmaster
 
CTTDNUG ASP.NET MVC
CTTDNUG ASP.NET MVC
Barry Gervin
 
ASP.NET MVC introduction
ASP.NET MVC introduction
Tomi Juhola
 
Introduction To Mvc
Introduction To Mvc
Volkan Uzun
 
Spring MVC
Spring MVC
yuvalb
 
Introduction To ASP.NET MVC
Introduction To ASP.NET MVC
Alan Dean
 
WebTest - Efficient Functional Web Testing with HtmlUnit and Beyond
WebTest - Efficient Functional Web Testing with HtmlUnit and Beyond
mguillem
 
Introduction to ASP.NET MVC
Introduction to ASP.NET MVC
Sunpawet Somsin
 
ASP.NET MVC Presentation
ASP.NET MVC Presentation
ivpol
 
A Web Developer's Journey across different versions of ASP.NET
A Web Developer's Journey across different versions of ASP.NET
Harish Ranganathan
 
Asp.Net Mvc
Asp.Net Mvc
micham
 
Asp.Net MVC Framework Design Pattern
Asp.Net MVC Framework Design Pattern
maddinapudi
 
Developing ASP.NET Applications Using the Model View Controller Pattern
Developing ASP.NET Applications Using the Model View Controller Pattern
goodfriday
 
MVC & SQL_In_1_Hour
MVC & SQL_In_1_Hour
Dilip Patel
 
Overview of MVC Framework - by software outsourcing company india
Overview of MVC Framework - by software outsourcing company india
Jignesh Aakoliya
 
Usability AJAX and other ASP.NET Features
Usability AJAX and other ASP.NET Features
Peter Gfader
 
ASP.net MVC CodeCamp Presentation
ASP.net MVC CodeCamp Presentation
buildmaster
 
Ad

More from Maarten Balliauw (20)

Bringing nullability into existing code - dammit is not the answer.pptx
Bringing nullability into existing code - dammit is not the answer.pptx
Maarten Balliauw
 
Nerd sniping myself into a rabbit hole... Streaming online audio to a Sonos s...
Nerd sniping myself into a rabbit hole... Streaming online audio to a Sonos s...
Maarten Balliauw
 
Building a friendly .NET SDK to connect to Space
Building a friendly .NET SDK to connect to Space
Maarten Balliauw
 
Microservices for building an IDE - The innards of JetBrains Rider - NDC Oslo...
Microservices for building an IDE - The innards of JetBrains Rider - NDC Oslo...
Maarten Balliauw
 
Indexing and searching NuGet.org with Azure Functions and Search - .NET fwday...
Indexing and searching NuGet.org with Azure Functions and Search - .NET fwday...
Maarten Balliauw
 
NDC Sydney 2019 - Microservices for building an IDE – The innards of JetBrain...
NDC Sydney 2019 - Microservices for building an IDE – The innards of JetBrain...
Maarten Balliauw
 
JetBrains Australia 2019 - Exploring .NET’s memory management – a trip down m...
JetBrains Australia 2019 - Exploring .NET’s memory management – a trip down m...
Maarten Balliauw
 
.NET Conf 2019 - Indexing and searching NuGet.org with Azure Functions and Se...
.NET Conf 2019 - Indexing and searching NuGet.org with Azure Functions and Se...
Maarten Balliauw
 
CloudBurst 2019 - Indexing and searching NuGet.org with Azure Functions and S...
CloudBurst 2019 - Indexing and searching NuGet.org with Azure Functions and S...
Maarten Balliauw
 
NDC Oslo 2019 - Indexing and searching NuGet.org with Azure Functions and Search
NDC Oslo 2019 - Indexing and searching NuGet.org with Azure Functions and Search
Maarten Balliauw
 
Approaches for application request throttling - Cloud Developer Days Poland
Approaches for application request throttling - Cloud Developer Days Poland
Maarten Balliauw
 
Indexing and searching NuGet.org with Azure Functions and Search - Cloud Deve...
Indexing and searching NuGet.org with Azure Functions and Search - Cloud Deve...
Maarten Balliauw
 
Approaches for application request throttling - dotNetCologne
Approaches for application request throttling - dotNetCologne
Maarten Balliauw
 
CodeStock - Exploring .NET memory management - a trip down memory lane
CodeStock - Exploring .NET memory management - a trip down memory lane
Maarten Balliauw
 
ConFoo Montreal - Microservices for building an IDE - The innards of JetBrain...
ConFoo Montreal - Microservices for building an IDE - The innards of JetBrain...
Maarten Balliauw
 
ConFoo Montreal - Approaches for application request throttling
ConFoo Montreal - Approaches for application request throttling
Maarten Balliauw
 
Microservices for building an IDE – The innards of JetBrains Rider - TechDays...
Microservices for building an IDE – The innards of JetBrains Rider - TechDays...
Maarten Balliauw
 
JetBrains Day Seoul - Exploring .NET’s memory management – a trip down memory...
JetBrains Day Seoul - Exploring .NET’s memory management – a trip down memory...
Maarten Balliauw
 
DotNetFest - Let’s refresh our memory! Memory management in .NET
DotNetFest - Let’s refresh our memory! Memory management in .NET
Maarten Balliauw
 
VISUG - Approaches for application request throttling
VISUG - Approaches for application request throttling
Maarten Balliauw
 
Bringing nullability into existing code - dammit is not the answer.pptx
Bringing nullability into existing code - dammit is not the answer.pptx
Maarten Balliauw
 
Nerd sniping myself into a rabbit hole... Streaming online audio to a Sonos s...
Nerd sniping myself into a rabbit hole... Streaming online audio to a Sonos s...
Maarten Balliauw
 
Building a friendly .NET SDK to connect to Space
Building a friendly .NET SDK to connect to Space
Maarten Balliauw
 
Microservices for building an IDE - The innards of JetBrains Rider - NDC Oslo...
Microservices for building an IDE - The innards of JetBrains Rider - NDC Oslo...
Maarten Balliauw
 
Indexing and searching NuGet.org with Azure Functions and Search - .NET fwday...
Indexing and searching NuGet.org with Azure Functions and Search - .NET fwday...
Maarten Balliauw
 
NDC Sydney 2019 - Microservices for building an IDE – The innards of JetBrain...
NDC Sydney 2019 - Microservices for building an IDE – The innards of JetBrain...
Maarten Balliauw
 
JetBrains Australia 2019 - Exploring .NET’s memory management – a trip down m...
JetBrains Australia 2019 - Exploring .NET’s memory management – a trip down m...
Maarten Balliauw
 
.NET Conf 2019 - Indexing and searching NuGet.org with Azure Functions and Se...
.NET Conf 2019 - Indexing and searching NuGet.org with Azure Functions and Se...
Maarten Balliauw
 
CloudBurst 2019 - Indexing and searching NuGet.org with Azure Functions and S...
CloudBurst 2019 - Indexing and searching NuGet.org with Azure Functions and S...
Maarten Balliauw
 
NDC Oslo 2019 - Indexing and searching NuGet.org with Azure Functions and Search
NDC Oslo 2019 - Indexing and searching NuGet.org with Azure Functions and Search
Maarten Balliauw
 
Approaches for application request throttling - Cloud Developer Days Poland
Approaches for application request throttling - Cloud Developer Days Poland
Maarten Balliauw
 
Indexing and searching NuGet.org with Azure Functions and Search - Cloud Deve...
Indexing and searching NuGet.org with Azure Functions and Search - Cloud Deve...
Maarten Balliauw
 
Approaches for application request throttling - dotNetCologne
Approaches for application request throttling - dotNetCologne
Maarten Balliauw
 
CodeStock - Exploring .NET memory management - a trip down memory lane
CodeStock - Exploring .NET memory management - a trip down memory lane
Maarten Balliauw
 
ConFoo Montreal - Microservices for building an IDE - The innards of JetBrain...
ConFoo Montreal - Microservices for building an IDE - The innards of JetBrain...
Maarten Balliauw
 
ConFoo Montreal - Approaches for application request throttling
ConFoo Montreal - Approaches for application request throttling
Maarten Balliauw
 
Microservices for building an IDE – The innards of JetBrains Rider - TechDays...
Microservices for building an IDE – The innards of JetBrains Rider - TechDays...
Maarten Balliauw
 
JetBrains Day Seoul - Exploring .NET’s memory management – a trip down memory...
JetBrains Day Seoul - Exploring .NET’s memory management – a trip down memory...
Maarten Balliauw
 
DotNetFest - Let’s refresh our memory! Memory management in .NET
DotNetFest - Let’s refresh our memory! Memory management in .NET
Maarten Balliauw
 
VISUG - Approaches for application request throttling
VISUG - Approaches for application request throttling
Maarten Balliauw
 

Recently uploaded (20)

Edge-banding-machines-edgeteq-s-200-en-.pdf
Edge-banding-machines-edgeteq-s-200-en-.pdf
AmirStern2
 
Introduction to Typescript - GDG On Campus EUE
Introduction to Typescript - GDG On Campus EUE
Google Developer Group On Campus European Universities in Egypt
 
National Fuels Treatments Initiative: Building a Seamless Map of Hazardous Fu...
National Fuels Treatments Initiative: Building a Seamless Map of Hazardous Fu...
Safe Software
 
FIDO Alliance Seminar State of Passkeys.pptx
FIDO Alliance Seminar State of Passkeys.pptx
FIDO Alliance
 
Integration of Utility Data into 3D BIM Models Using a 3D Solids Modeling Wor...
Integration of Utility Data into 3D BIM Models Using a 3D Solids Modeling Wor...
Safe Software
 
Mastering AI Workflows with FME - Peak of Data & AI 2025
Mastering AI Workflows with FME - Peak of Data & AI 2025
Safe Software
 
Oracle Cloud Infrastructure AI Foundations
Oracle Cloud Infrastructure AI Foundations
VICTOR MAESTRE RAMIREZ
 
“Why It’s Critical to Have an Integrated Development Methodology for Edge AI,...
“Why It’s Critical to Have an Integrated Development Methodology for Edge AI,...
Edge AI and Vision Alliance
 
“Addressing Evolving AI Model Challenges Through Memory and Storage,” a Prese...
“Addressing Evolving AI Model Challenges Through Memory and Storage,” a Prese...
Edge AI and Vision Alliance
 
Scaling GenAI Inference From Prototype to Production: Real-World Lessons in S...
Scaling GenAI Inference From Prototype to Production: Real-World Lessons in S...
Anish Kumar
 
Enabling BIM / GIS integrations with Other Systems with FME
Enabling BIM / GIS integrations with Other Systems with FME
Safe Software
 
FIDO Seminar: Authentication for a Billion Consumers - Amazon.pptx
FIDO Seminar: Authentication for a Billion Consumers - Amazon.pptx
FIDO Alliance
 
Bridging the divide: A conversation on tariffs today in the book industry - T...
Bridging the divide: A conversation on tariffs today in the book industry - T...
BookNet Canada
 
TrustArc Webinar - 2025 Global Privacy Survey
TrustArc Webinar - 2025 Global Privacy Survey
TrustArc
 
Can We Use Rust to Develop Extensions for PostgreSQL? (POSETTE: An Event for ...
Can We Use Rust to Develop Extensions for PostgreSQL? (POSETTE: An Event for ...
NTT DATA Technology & Innovation
 
Reducing Conflicts and Increasing Safety Along the Cycling Networks of East-F...
Reducing Conflicts and Increasing Safety Along the Cycling Networks of East-F...
Safe Software
 
Data Validation and System Interoperability
Data Validation and System Interoperability
Safe Software
 
MuleSoft for AgentForce : Topic Center and API Catalog
MuleSoft for AgentForce : Topic Center and API Catalog
shyamraj55
 
Oracle Cloud and AI Specialization Program
Oracle Cloud and AI Specialization Program
VICTOR MAESTRE RAMIREZ
 
FIDO Seminar: Perspectives on Passkeys & Consumer Adoption.pptx
FIDO Seminar: Perspectives on Passkeys & Consumer Adoption.pptx
FIDO Alliance
 
Edge-banding-machines-edgeteq-s-200-en-.pdf
Edge-banding-machines-edgeteq-s-200-en-.pdf
AmirStern2
 
National Fuels Treatments Initiative: Building a Seamless Map of Hazardous Fu...
National Fuels Treatments Initiative: Building a Seamless Map of Hazardous Fu...
Safe Software
 
FIDO Alliance Seminar State of Passkeys.pptx
FIDO Alliance Seminar State of Passkeys.pptx
FIDO Alliance
 
Integration of Utility Data into 3D BIM Models Using a 3D Solids Modeling Wor...
Integration of Utility Data into 3D BIM Models Using a 3D Solids Modeling Wor...
Safe Software
 
Mastering AI Workflows with FME - Peak of Data & AI 2025
Mastering AI Workflows with FME - Peak of Data & AI 2025
Safe Software
 
Oracle Cloud Infrastructure AI Foundations
Oracle Cloud Infrastructure AI Foundations
VICTOR MAESTRE RAMIREZ
 
“Why It’s Critical to Have an Integrated Development Methodology for Edge AI,...
“Why It’s Critical to Have an Integrated Development Methodology for Edge AI,...
Edge AI and Vision Alliance
 
“Addressing Evolving AI Model Challenges Through Memory and Storage,” a Prese...
“Addressing Evolving AI Model Challenges Through Memory and Storage,” a Prese...
Edge AI and Vision Alliance
 
Scaling GenAI Inference From Prototype to Production: Real-World Lessons in S...
Scaling GenAI Inference From Prototype to Production: Real-World Lessons in S...
Anish Kumar
 
Enabling BIM / GIS integrations with Other Systems with FME
Enabling BIM / GIS integrations with Other Systems with FME
Safe Software
 
FIDO Seminar: Authentication for a Billion Consumers - Amazon.pptx
FIDO Seminar: Authentication for a Billion Consumers - Amazon.pptx
FIDO Alliance
 
Bridging the divide: A conversation on tariffs today in the book industry - T...
Bridging the divide: A conversation on tariffs today in the book industry - T...
BookNet Canada
 
TrustArc Webinar - 2025 Global Privacy Survey
TrustArc Webinar - 2025 Global Privacy Survey
TrustArc
 
Can We Use Rust to Develop Extensions for PostgreSQL? (POSETTE: An Event for ...
Can We Use Rust to Develop Extensions for PostgreSQL? (POSETTE: An Event for ...
NTT DATA Technology & Innovation
 
Reducing Conflicts and Increasing Safety Along the Cycling Networks of East-F...
Reducing Conflicts and Increasing Safety Along the Cycling Networks of East-F...
Safe Software
 
Data Validation and System Interoperability
Data Validation and System Interoperability
Safe Software
 
MuleSoft for AgentForce : Topic Center and API Catalog
MuleSoft for AgentForce : Topic Center and API Catalog
shyamraj55
 
Oracle Cloud and AI Specialization Program
Oracle Cloud and AI Specialization Program
VICTOR MAESTRE RAMIREZ
 
FIDO Seminar: Perspectives on Passkeys & Consumer Adoption.pptx
FIDO Seminar: Perspectives on Passkeys & Consumer Adoption.pptx
FIDO Alliance
 

Introduction to ASP.NET MVC

  • 1.  
  • 2. Introducing the ASP.NET MVC framework Maarten Balliauw – Real Dolmen Website: www.realdolmen.com E-mail: [email_address] Blog: http://blog.maartenballiauw.be
  • 3. AGENDA MVC ASP.NET MVC Hello world! Routing Extensibility Testing …
  • 4. MVC – MODEL-VIEW-CONTROLLER Design pattern Isolating business logic from UI Maintainability Layering for UI layer
  • 5. ASP.NET MVC A new option for ASP.NET Simpler way to program ASP.NET Easily testable and TDD friendly More control over your <html/> More control over your URLs Not for everyone! (car vs. motorcycle) Not a replacement for webforms! Supports existing ASP.NET features
  • 6. WHAT YOU WILL LOSE… Viewstate Postbacks Tricky interview questions about nuances of the page lifecycle
  • 7. HOW IT WORKS… Browser Web Server http://myserver.com/Products/Edit/5 http://myserver.com/Products/
  • 8. INTERACTIONS /Products/Edit/5 ProductsController (Controller) /Products/Update/5 URL:
  • 10. WHAT’S THE POINT? It’s not WebForms 4.0! It’s an alternative Flexible Extendible in each part of the process Fundamental Only System.Web! (Not WPF or Winforms) Plays well with others NHibernate for models, NVelocity for views, Unity for dependency injection, … Keep things simple!
  • 11. GOALS Maintain Clean Separation of Concerns Easy Testing Red/Green TDD Highly maintainable applications by default Extensible and Pluggable Support replacing any component of system Source available on CodePlex Not open source Build your own, private version
  • 12. DRIVING GOALS Enable clean URLs and SEO SEO friendly URL structures Great ASP.NET integration All providers are supported Membership, Caching, Session, … ASP.NET designer in VS2008 Check my blog! http://tinyurl.com/maarten-outputcache http://tinyurl.com/maarten-mvcsitemap
  • 13. REQUEST LIFECYCLE Browser requests /Products/ Route is determined Controller is activated Method on Controller is invoked Controller does some stuff Renders View, passing in ViewData
  • 14. ACTUALLY, THERE’S MORE… You can replace each step of the process!
  • 16. ROUTING – PRETTY URLS Developer adds Routes to a global RouteTable Mapping creates RouteData – a bag of key/values This is NOT URL rewriting! It’s more! public static void RegisterRoutes(RouteCollection routes) { routes.MapRoute( &quot;Default &quot;{controller}/{action}/{id}&quot;, new { controller = &quot;Home&quot;, action = &quot;Index&quot;, id = &quot;&quot; }, new { controller = @&quot;[^\.]*&quot; } ); }
  • 17. CUSTOM URL ROUTING Can setup custom URL routing rules within the RegisterRoutes() method in Global.asax Enables very flexible mapping and route rules: Default parameters Constraints Named routes Wildcard “catch-all” routes
  • 19. EXTENSIBILITY These are all pluggable! Views Controllers Models Routes Check my blog! http://tinyurl.com/maarten-mvccustomviewengine MvcContrib http://www.codeplex.com/MvcContrib
  • 20. VIEWENGINE, VIEW View engines instantiate views Views render output You get WebForms by default Can implement your own MvcContrib has them for Brail, NHaml, NVelocity, … Customizing these can be used to Offer new DSLs to make HTML easier Generate totally different mime/types Images, RSS, JSON, XML, OFX, VCards, DOCX, whatever public abstract class VirtualPathProviderViewEngine : IViewEngine { protected abstract IView CreatePartialView(...); protected abstract IView CreateView(…); } public interface IView { void Render(ViewContext viewContext, TextWriter writer); }
  • 21. NHAML – FROM… <%@ Page Language=&quot;C#&quot; MasterPageFile=&quot;~/Views/Shared/Site.Master&quot; AutoEventWireup=&quot;true&quot; CodeBehind=&quot;List.aspx&quot; Inherits=&quot;MvcApplication5.Views.Products.List&quot; Title=&quot;Products&quot; %> <asp:Content ContentPlaceHolderID=&quot;MainContentPlaceHolder&quot; runat=&quot;server&quot;> <h2><%= ViewData.CategoryName %></h2> <ul> <% foreach (var product in ViewData.Products) { %> <li> <%= product.ProductName %> <div class=&quot;editlink&quot;> (<%= Html.ActionLink(&quot;Edit&quot;, new { Action=&quot;Edit&quot;, ID=product.ProductID })%>) </div> </li> <% } %> </ul> <%= Html.ActionLink(&quot;Add New Product&quot;, new { Action=&quot;New&quot; }) %> </asp:Content>
  • 22. NHAML – TO… http://code.google.com/p/nhaml/ %h2= ViewData.CategoryName %ul - foreach (var product in ViewData.Products) %li = product.ProductName .editlink = Html.ActionLink(&quot;Edit&quot;, new { Action=&quot;Edit&quot;, ID=product.ProductID }) = Html.ActionLink(&quot;Add New Product&quot;, new { Action=&quot;New&quot; })
  • 23. SPARK – FROM… <%@ Page Language=&quot;C#&quot; MasterPageFile=&quot;~/Views/Shared/Site.Master&quot; AutoEventWireup=&quot;true&quot; CodeBehind=&quot;List.aspx&quot; Inherits=&quot;MvcApplication5.Views.Products.List&quot; Title=&quot;Products&quot; %> <asp:Content ContentPlaceHolderID=&quot;MainContentPlaceHolder&quot; runat=&quot;server&quot;> <h2><%= ViewData.CategoryName %></h2> <ul> <% foreach (var product in ViewData.Products) { %> <li> <%= product.ProductName %> <div class=&quot;editlink&quot;> (<%= Html.ActionLink(&quot;Edit&quot;, new { Action=&quot;Edit&quot;, ID=product.ProductID })%>) </div> </li> <% } %> </ul> <%= Html.ActionLink(&quot;Add New Product&quot;, new { Action=&quot;New&quot; }) %> </asp:Content>
  • 24. SPARK – TO… http://dev.dejardin.org/ <viewdata model=&quot;MvcApplication5.Models.Product“/> <h2>${ViewData.CategoryName}</h2> <ul> <for each=&quot;var product in ViewData.Products&quot;> <li> ${product.ProductName} <div class=&quot;editlink&quot;> (<a href=&quot;/Products/Edit/${product.ProductID}&quot;>Edit</a>) </div> </li> </for> </ul> <a href=&quot;/Products/New&quot;>Add New Product</a>
  • 25. FILTER ATTRIBUTES Enable custom behavior to be added to Controllers and Controller actions 4 types Authentication filter Action filter Result filter Exception filter Examples: [Authorize], [LogAction], [OutputCache], … http://tinyurl.com/maarten-outputcache
  • 27. TESTING Has anyone tried testing webforms? Without IIS being fired up? Each component tested individually?
  • 28. INTERFACES AND TESTING These are all easily mockable! HttpContextBase, HttpResponseBase, HttpRequestBase Extensibility IController IControllerFactory IRouteHandler IViewEngine
  • 29. TESTING CONTROLLER ACTIONS No requirement to test within ASP.NET runtime! Can mock parts of runtime you want to fake Using Moq, Rhino, TypeMock, … http://code.google.com/p/moq/ [TestMethod] public void ShowPostsDisplayPostView() { BlogController controller = new BlogController(…); var result = controller.ShowPost(2) as ViewResult; Assert.IsNotNull(result); Assert.AreEqual(result.ViewData[ &quot; Message &quot; ], &quot; Hello &quot; ); }
  • 30. TESTING CONTROLLER ACTIONS USING MOQ [TestMethod] public void TestInvalidCredentials() { LoginController controller = new LoginController(); var mock = new Mock<System.Web.Security.MembershipProvider>(); mock.Expect(m => m.ValidateUser(&quot;&quot;, &quot;&quot;)).Returns(false); controller.MembershipProviderInstance = mock.Object; var result = controller.Authenticate(&quot;&quot;, &quot;&quot;) as ViewResult; Assert.IsNotNull(result); Assert.AreEqual(result.ViewName, &quot;Index&quot;); Assert.AreEqual(controller.ViewData[&quot;ErrorMessage&quot;], &quot;Invalid credentials! Please verify your username and password.&quot;); }
  • 31. TESTING FRAMEWORKS Any framework is supported! Visual Studio Test NUnit XUnit …
  • 33. DEMO A complete application!
  • 34. SUMMARY A new option for ASP.NET. More control over your <html/> and URLs More easily testable approach Not for everyone – only use it if you want to Shipping later this year
  • 35. COMMON QUESTIONS Should I use WebForms or MVC? Are there any controls? Do I have to write <%= %> code in my view? What about AJAX? How fast/scalable is it? Is it safe? When will it ship?
  • 37. THANK YOU! Make sure to check http://blog.maartenballiauw.be/category/MVC.aspx