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

What’s the Point?

This is not Web Forms 4.0

It’s about alternatives. Car vs. Motorcycle. Extend it, add IOC. Or not. If the shoe pinches, don’t wear it.

Simple or as complex as you like

Fundamental

Part of System.Web and isn’t 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
Don’t fall asleep, it’ll 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
Wasn’t 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, didn’t I?

Demo – ImageGen
It’s 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

It’s 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

It’s about alternatives. Car vs. Motorcycle. Extend it, add IOC. Or not. If the shoe pinches, don’t wear it.

Simple or as complex as you like

Fundamental

Part of System.Web and isn’t 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!

Sign up to vote on this title
UsefulNot useful