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