You are on page 1of 26

Introduction to the ASP.

NET MVC Framework


Click to edit Master subtitle style

MVC

Intro

Goodness

Maintain Clean Separation of Concerns


Easy Testing Red/Green TDD Highly maintainable applications by default

Extensible and Pluggable

Support replacing any component of the system

Goodness

Enable clean URLs and HTML

SEO and REST friendly URL structures

Great integration within ASP.NET

Support both static and dynamic languages

Whats the Point?

This is not Web Forms 4.0

Its about alternatives. Car vs. Motorcycle. Extend it, add IOC. Or not. If the shoe pinches, dont wear it.

Simple or as complex as you like

Fundamental

Part of System.Web and isnt going anywhere. Feel free to use NHibernate for Models, Brail for Views and Whatever for Controllers. Be Happy.

Plays Well With Others

MVC

A Little More Detail


Browser requests /Products/ Route is determined Controller is activated Method on Controller is invoke Controller does some stuff Renders View, passing in custom ViewData URLs are rendered, pointing to other Controllers

Even More Detail Request Flow

You can futz at each step in the process

Demo Hello MVC World


Dont fall asleep, itll be worth it. Click to edit Master subtitle style

MVC

How it works

Basic Controller Handling

Scenarios, Goals and Design

URLs route to controller actions, not pages mark actions in Controller. Controller executes logic, chooses view.

[ControllerAction] public void ShowPost(int id) { Post p = PostRepository.GetPostById(id); if (p != null) { RenderView("showpost", p); } else { RenderView("nosuchpost", id); } }

Basic Views

Scenarios, Goals and Design:

Are for rendering/output.

Pre-defined and extensible rendering helpers

Can use .ASPX, .ASCX, .MASTER, etc. Can replace with other view technologies:

Template engines (NVelocity, Brail, ). Output formats (images, RSS, JSON, ). Mock out for testing. Loosely typed or strongly typed data

Controller sets data on the View

URL Routing Pretty URIs


Developers adds Routes to a global RouteTable Mapping creates a RouteData - a bag of key/values

protected void Application_Start(object sender, EventArgs e) { RouteTable.Routes.Add(new Route { Url = "Blog/bydate/[year]/[month]/[day]", Defaults = new { controller="blog", action="showposts" }, Validation = new { year=@"\d{1,4}", month= @"\d{1,2}", day = @"\d{1,2}"} }); RouteTable.Routes.Add(new Route { Url = "[controller]/[action]/[id]", RouteHandler = typeof(MvcRouteHandler) }); }

Demo Routing
The route less travelled Click to edit Master subtitle style

MVC

How To TEST IT

Interfaces and TDD

Mockable Intrinsics

IHttpContext, IHttpResponse, IHttpRequest IController IControllerFactory IRouteHandler IView IViewFactory

Extensibility

Testing Controller Actions


No requirement to mock out full [TestMethod] ASP.NET runtime. public void ShowPostsDisplayPostView() {

TestPostRepository repository = new TestPostRepository(); TestViewFactory viewFactory = new TestViewFactory(); BlogController controller = new BlogController(); controller.ShowPost(2); Assert.AreEqual("showpost", viewFactory.LastRequestedView); Assert.IsTrue(repository.GetPostByIdWasCalled); Assert.AreEqual(2, repository.LastRequestedPostId);

Controller Factory

Scenarios, Goals and Design:

Hook creation of controller instance


Dependency Injection. Object Interception.

public interface IControllerFactory { IController CreateController(IHttpContext context, RouteData routeData, Type controllerType); } protected void Application_Start(object s, EventArgs e) { ControllerBuilder.Current.SetDefaultControllerFactory( typeof(MyControllerFactory)); }

View Factory

Scenarios, Goals and Design:


Mock out views for testing Replace ASPX with other technologies

public interface IViewFactory { IView CreateView(IHttpContext context, RouteData routeData, string viewName, string layoutName, object viewData); } Inside controller class: ViewFactory = new XmlViewFactory(...); RenderView("foo", myData);

Demo TDD
Wasnt edit Master subtitle style Click to this demo technically supposed to be first?

Demo Dynamic Data Controls


Click to edit Master subtitle style

Not DDE. Scared you, didnt I?

Demo ImageGen
Its your thing. Click to edit Master subtitle style Do what you wanna do.

Demo Ruby View Engine & Python Controller


Click to edit Master subtitle style

Its a kinder, gentler Microsoft. No seriously. Hug?

Demo XML-RPC
Click to edit Master subtitle style

SOAP is for dorks.

Conclusion

This is not Web Forms 4.0

Its about alternatives. Car vs. Motorcycle. Extend it, add IOC. Or not. If the shoe pinches, dont wear it.

Simple or as complex as you like

Fundamental

Part of System.Web and isnt going anywhere. Feel free to use NHibernate for Models, Brail for Views and VB for Controllers. Be Happy.

Plays Well With Others

Your Feedback is Important


Please fill out a session evaluation form and either put them in the basket near the exit or drop them off at the conference registration desk. Thank you!