KEMBAR78
Introduction to ASP.NET MVC | PPT
 
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

Introduction to ASP.NET MVC

  • 1.
  • 2.
    Introducing the ASP.NETMVC framework Maarten Balliauw – Real Dolmen Website: www.realdolmen.com E-mail: [email_address] Blog: http://blog.maartenballiauw.be
  • 3.
    AGENDA MVC ASP.NETMVC Hello world! Routing Extensibility Testing …
  • 4.
    MVC – MODEL-VIEW-CONTROLLERDesign pattern Isolating business logic from UI Maintainability Layering for UI layer
  • 5.
    ASP.NET MVC Anew 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 WILLLOSE… 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:
  • 9.
  • 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 CleanSeparation 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 Enableclean 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 Browserrequests /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!
  • 15.
  • 16.
    ROUTING – PRETTYURLS 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 ROUTINGCan 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
  • 18.
  • 19.
    EXTENSIBILITY These areall pluggable! Views Controllers Models Routes Check my blog! http://tinyurl.com/maarten-mvccustomviewengine MvcContrib http://www.codeplex.com/MvcContrib
  • 20.
    VIEWENGINE, VIEW Viewengines 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 Enablecustom 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
  • 26.
  • 27.
    TESTING Has anyonetried testing webforms? Without IIS being fired up? Each component tested individually?
  • 28.
    INTERFACES AND TESTINGThese are all easily mockable! HttpContextBase, HttpResponseBase, HttpRequestBase Extensibility IController IControllerFactory IRouteHandler IViewEngine
  • 29.
    TESTING CONTROLLER ACTIONSNo 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 ACTIONSUSING 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 Anyframework is supported! Visual Studio Test NUnit XUnit …
  • 32.
  • 33.
    DEMO A completeapplication!
  • 34.
    SUMMARY A newoption 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 ShouldI 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?
  • 36.
  • 37.
    THANK YOU! Makesure to check http://blog.maartenballiauw.be/category/MVC.aspx