480 likes | 605 Views
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
E N D
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 (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
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!
“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!
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
DEMO: MVC Hello World Let’s whet the appetite!
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
Driving Goals • Separation of Concerns • Easy testing & TDD • Highly-maintainable applications • Extensible and Pluggable • Plug in what you need • Build your own custom build
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
Take a Look Under the Hood Careful – there’s a grease spot over there…
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
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
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); } }
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
ASP.NET MVC Features Routing Filters Extensibility View Engines Controller Factories Routing Handler
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}"}} })
Demo: URL Routing “Can’t you just stop and ask for directions!?”
URL Routing (cont’d) • Separate assembly, not closely tied/related to ASP.NET MVC
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); }
Extensibility • Views • Controllers • Models • Routes …all Pluggable
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.
ViewEngineBase Class public abstract class ViewEngineBase { public abstract void RenderView(ViewContextviewContext); }
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>
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" })
Demo: Filters and View Engines Now we can really take control!
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
Testability “What!? I can mock out HttpContext!?”
Designed for Testability • MockableIntrinsics • HttpContextBase, HttpResponseBase, HttpRequestBase • Extensibility • IController • IControllerFactory • IRouteHandler • ViewEngineBase
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); }
DEMO: Test-Driven Development “Wasn’t this supposed to come first?”
Popular Questions (I know what you’re thinking…)
Why reinvent the wheel? • Aren’t there already existing frameworks out there, such as Monorail?
ASP.NET MVC & REST • Does MVC do REST? • Depends on your definition. • What about ADO.NET Data Extensions (Astoria) and/or WCF?
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
What about AJAX? • ASP.NET AJAX? • Requires <form runat=“server”> • Roll your own • JS frameworks like jQuerymake this easier
Scalability, Performance, Security, Etc. • A layer of abstraction working over the solid, tested ASP.NET foundation
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
Q & A (…and Thank You!)
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