the ASP.NET MVC Framework

Download Report

Transcript the ASP.NET MVC Framework

Jess Chadwick
Website Manager, Infragistics
[email protected]
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
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
Classic ASP Example
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 Page Lifecycle
“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…
Request
Request Flow
HTTP
Routing
Http
Handler
Controller
Response
Route
Route
Handler
View
Engine
View
The Pattern
Model
View
Controller
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 ActionResult ShowPost(int id) {
Post p = PostRepository.GetPostById(id);
if (p == null) {
return RenderView("nosuchpost", id);
} else {
return RenderView(“showpost", p);
}
}
Request
Request Flow
HTTP
Routing
Http
Handler
Controller
Response
Route
Route
Handler
View
Engine
View
The MVC Pattern in action
Model
View
•
•
•
•
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
Controller
DEMO: Northwind Sample
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(ViewContext viewContext);
}
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:Content ContentPlaceHolderID="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
 Controller factories
(for IoC)
 Castle (Windsor)
 View Engines
 NHaml
 NVelocity
 Brail
 Xslt
 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
 Mockable Intrinsics
 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();
TestViewEngine viewEngine = 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 jQuery make this easier
Scalability, Performance,
Security, Etc.
 A layer of abstraction working over the solid,
tested ASP.NET foundation
When’s It Gonna
Be Ready?
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!)
Jess Chadwick
Resources
Web Lead
Infragistics, Inc.
[email protected]
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