1 / 48

the ASP.NET MVC Framework

Jess Chadwick Website Manager, Infragistics jesschadwick@gmail.com. the ASP.NET MVC Framework. History of Microsoft Web Stuff. The Genealogy of Awesomeness. Active Server Pages. Active Server Pages (ASP). V1 circa 1996 “Active Scripting Pages”: top-down script

noel
Download Presentation

the ASP.NET MVC Framework

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Jess Chadwick Website Manager, Infragistics jesschadwick@gmail.com the ASP.NET MVC Framework

  2. History of Microsoft Web Stuff The Genealogy of Awesomeness

  3. Active Server Pages

  4. Active Server Pages (ASP) • V1 circa 1996 • “Active Scripting Pages”: top-down script • Call into VB6/COM code to do “real work” • You might remember these oldies but goodies: • Request object • Response object • Session object • Server object • Application object • ObjectContext object • ASPError object

  5. Classic ASP Example

  6. ASP.NET • Released in 2002 as part of .NET 1.0 • Not “ASP v.Next” – completely new • Introduced a few important concepts: • Rich programming framework • Code-Behind • Page Lifecycle • The omnipresent ViewState!

  7. ASP.NET Page Lifecycle

  8. “ASP.NET Extensions” • Started with “ASP.NET Futures” • ASP.NET AJAX • Silverlight Controls • ADO.NET Data Services • ASP.NET Dynamic Data And… • ASP.NET MVC!

  9. What is ASP.NET MVC? • Microsoft’s ASP.NET implementation of the MVC software pattern • More control over your HTML and URLs • More easily testable framework • A new Web Project type for ASP.NET • An option / alternative

  10. DEMO: MVC Hello World Let’s whet the appetite!

  11. What’s the Point? • This is not “Web Forms v.Next” • All about alternatives • Flexibility • Extend it… or not • Create your own Controller- and ViewEngines, or use others such as Brail or NHaml • Fundamental • Part of System.Web namespace • Fully supported • KISS & DRY

  12. Driving Goals • Separation of Concerns • Easy testing & TDD • Highly-maintainable applications • Extensible and Pluggable • Plug in what you need • Build your own custom build

  13. Driving Goals (cont’d) • Clean URLs and HTML • SEO and REST friendly • Great interaction with ASP.NET • Handlers, Modules, Providers, etc. still work • .ASPX, .ASCX, .MASTER pages • Visual Studio ASP.NET Designer surface

  14. Take a Look Under the Hood Careful – there’s a grease spot over there…

  15. Request Flow

  16. The Pattern

  17. The Model “The center of the universe” - Todd Snyder • This represents your core business domain…AKA – your “bread and butter” • Preferably independent of any specific technology

  18. Views • Are for rendering/output. • Are usually pretty “stupid” • Web Forms as default ViewEngine • .ASPX, .ASCX, .MASTER, etc. • Html Helpers for rendering markup • Can replace with other view technologies: • Template engines (NVelocity, Brail, …). • Output formats (images, RSS, JSON, …). • Mock out for testing. • Can use loosely typed or strongly typed data

  19. Controllers • URLs route to actions on controllers, not pages • Controller executes logic, loads data (if any), and chooses view. • Can also redirect to other views & URLs public ActionResultShowPost(int id) { Post p = PostRepository.GetPostById(id); if (p == null) { return RenderView("nosuchpost", id); } else { return RenderView(“showpost", p); } }

  20. Request Flow

  21. The MVC Pattern in action • Browser makes a request • Route is determined • Controller is activated • Method on Controller is invoked • Controller does some stuff • Renders View, passing in custom ViewData • URLs are rendered, pointing to other Controllers

  22. DEMO: Northwind Sample

  23. ASP.NET MVC Features Routing Filters Extensibility View Engines Controller Factories Routing Handler

  24. URL Routing • Developers add Routes to a global RouteTable • Mapping creates a RouteData - a bag of key/values RouteTable.Routes.Add( new Route("blog/bydate/{year}/{month}/{day}", new MvcRouteHandler()){ Defaults = new RouteValueDictionary { {"controller", "blog"}, {"action", "show"} }, Constraints = new RouteValueDictionary { {"year", @"\d{1.4}"}, {"month", @"\d{1.2}"}, {"day", @"\d{1.2}"}} })

  25. Demo: URL Routing “Can’t you just stop and ask for directions!?”

  26. URL Routing (cont’d) • Separate assembly, not closely tied/related to ASP.NET MVC

  27. Filters • Add pre- and post-execute behaviors to your controller actions • Useful for logging, compression, etc. public abstract class ActionFilterAttribute { public void OnActionExecuting(ActionExecutingContext context) ; public void OnActionExecuted(ActionExecutingContext context) ; // New in Pre-Preview 3: public void OnResultExecuting(ResultExecutingContext context); public void OnResultExecuted(ResultExecutedContext context); }

  28. Extensibility • Views • Controllers • Models • Routes …all Pluggable

  29. ViewEngineBase • View Engines render output • You get WebForms by default • Can implement your own • MVCContrib has ones for Brail, Nvelocity • NHaml is an interesting one to watch • View Engines can be used to • Offer new DSLs to make HTML easier • Generate totally different mime/types • Images, RSS, JSON, XML, OFX, VCards, whatever.

  30. ViewEngineBase Class public abstract class ViewEngineBase { public abstract void RenderView(ViewContextviewContext); }

  31. Example View: Web Forms <%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" AutoEventWireup="true" CodeBehind="List.aspx" Inherits="MvcApplication5.Views.Products.List" Title="Products" %> <asp:ContentContentPlaceHolderID="MainContentPlaceHolder" runat="server"> <h2><%= ViewData.CategoryName %></h2> <ul> <% foreach (var product in ViewData.Products) { %> <li> <%= product.ProductName %> <div class="editlink"> (<%= Html.ActionLink("Edit", new { Action="Edit", ID=product.ProductID })%>) </div> </li> <% } %> </ul> <%= Html.ActionLink("Add New Product", new { Action="New" }) %> </asp:Content>

  32. Example View: NHaml %h2= ViewData.CategoryName %ul - foreach (var product in ViewData.Products) %li = product.ProductName .editlink = Html.ActionLink("Edit", new { Action="Edit", ID=product.ProductID }) = Html.ActionLink("Add New Product", new { Action="New" })

  33. Demo: Filters and View Engines Now we can really take control!

  34. MVCContrib Open Source project with extensions to base framework • Myriad UI helper extensions and classes • View Engines • NHaml • NVelocity • Brail • Xslt • Controller factories (for IoC) • Castle (Windsor) • Spring.NET • Ninject • StructureMap • Object Builder • Unity On CodePlex at http://www.codeplex.com/MVCContrib

  35. Testability “What!? I can mock out HttpContext!?”

  36. Designed for Testability • MockableIntrinsics • HttpContextBase, HttpResponseBase, HttpRequestBase • Extensibility • IController • IControllerFactory • IRouteHandler • ViewEngineBase

  37. Testing Controller Actions • No requirement to test within ASP.NET runtime! • Use RhinoMocks, TypeMock, Moq, etc. • Create Test versions of the parts of the runtime you want to stub [TestMethod] public void ShowPostsDisplayPostView() { TestPostRepository repository = new TestPostRepository(); TestViewEngineviewEngine = new TestViewEngine(); BlogController controller = new BlogController(…); controller.ShowPost(2); Assert.AreEqual("showpost",viewEngine.LastRequestedView); Assert.IsTrue(repository.GetPostByIdWasCalled); Assert.AreEqual(2, repository.LastRequestedPostId); }

  38. DEMO: Test-Driven Development “Wasn’t this supposed to come first?”

  39. Popular Questions (I know what you’re thinking…)

  40. Why reinvent the wheel? • Aren’t there already existing frameworks out there, such as Monorail?

  41. ASP.NET MVC & REST • Does MVC do REST? • Depends on your definition.  • What about ADO.NET Data Extensions (Astoria) and/or WCF?

  42. Controls & Components • Can still use server controls? • Can we still use Web Forms server controls? • Decent support for user controls • Still more/better support to come

  43. What about AJAX? • ASP.NET AJAX? • Requires <form runat=“server”> • Roll your own • JS frameworks like jQuerymake this easier

  44. Scalability, Performance, Security, Etc. • A layer of abstraction working over the solid, tested ASP.NET foundation

  45. When’s It GonnaBe Ready?

  46. What’s the Point? • This is not “Web Forms v.Next” • All about alternatives • Flexibility • Extend it… or not • Create your own Controller- and ViewEngines, or use others such as Brail or NHaml • Fundamental • Part of System.Web namespace • Fully supported • KISS & DRY

  47. Q & A (…and Thank You!)

  48. Resources Jess Chadwick Web Lead Infragistics, Inc. jesschadwick@gmail.com http://blog.jesschadwick.com • The Bits • ASP.NET MVC Preview 2: http://asp.net/MVC • ASP.NET MVC Pre-Preview3: http://www.codeplex.com/aspnet • MVCContrib: http://www.codeplex.com/MVCContrib • Quickstart • http://quickstarts.asp.net/3-5-extensions/mvc/default.aspx • Videos • ASP.NET: http://www.asp.net/learn/3.5-extensions-videos/ • MIX: http://sessions.visitmix.com • Community/Blogs • ASP.NET Forums: http://forums.asp.net/1146.aspx • Scott Guthrie (ScottGu): http://weblogs.asp.net/scottgu/ • Scott Hanselman: http://www.hanselman.com/blog/ • Phil Haack: http://haacked.com/ • Sample Apps • MVC Samples: http://www.codeplex.com/mvcsamples • CodeCampServer: http://codecampserver.org

More Related