26
AMS304: Introduction to the ASP.NET Model View Controller (MVC) Framework Scott Hanselman Eilon Lipton Microsoft Microsoft [email protected] [email protected]

Hanselman lipton asp_connections_ams304_mvc

Embed Size (px)

Citation preview

Page 1: Hanselman lipton asp_connections_ams304_mvc

AMS304: Introduction to the ASP.NET Model View Controller

(MVC) Framework

Scott Hanselman Eilon Lipton

Microsoft [email protected] [email protected]

Page 2: Hanselman lipton asp_connections_ams304_mvc

INTROMVC

Page 3: Hanselman lipton asp_connections_ams304_mvc

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

Page 4: Hanselman lipton asp_connections_ams304_mvc

Goodness

• Enable clean URLs and HTML● SEO and REST friendly URL structures

• Great integration within ASP.NET● Support both static and dynamic languages

Page 5: Hanselman lipton asp_connections_ams304_mvc

What’s the Point?

• This is not Web Forms 4.0● It’s about alternatives. Car vs. Motorcycle.

• Simple or as complex as you like● Extend it, add IOC. Or not. If the shoe pinches, don’t

wear it.

• Fundamental● Part of System.Web and isn’t going anywhere.

• Plays Well With Others● Feel free to use NHibernate for Models, Brail for

Views and Whatever for Controllers. Be Happy.

Page 6: Hanselman lipton asp_connections_ams304_mvc

MVC

Model

ControllerView

Page 7: Hanselman lipton asp_connections_ams304_mvc

A Little More Detail

Model

ControllerView

• 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

Page 8: Hanselman lipton asp_connections_ams304_mvc

Even More Detail – Request Flow

• You can futz at each step in the process

Request

Page 9: Hanselman lipton asp_connections_ams304_mvc

Demo – Hello MVC World

Don’t fall asleep, it’ll be worth it.

Page 10: Hanselman lipton asp_connections_ams304_mvc

HOW IT WORKSMVC

Page 11: Hanselman lipton asp_connections_ams304_mvc

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); }}

Page 12: Hanselman lipton asp_connections_ams304_mvc

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.

● Controller sets data on the View• Loosely typed or strongly typed data

Page 13: Hanselman lipton asp_connections_ams304_mvc

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) });

}

Page 14: Hanselman lipton asp_connections_ams304_mvc

Demo – Routing

The route less travelled…

Page 15: Hanselman lipton asp_connections_ams304_mvc

HOW TO TEST ITMVC

Page 16: Hanselman lipton asp_connections_ams304_mvc

Interfaces and TDD

• Mockable Intrinsics● IHttpContext, IHttpResponse, IHttpRequest

• Extensibility ● IController● IControllerFactory● IRouteHandler● IView● IViewFactory

Page 17: Hanselman lipton asp_connections_ams304_mvc

Testing Controller Actions

• No requirement to mock out full ASP.NET runtime.[TestMethod]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);}

Page 18: Hanselman lipton asp_connections_ams304_mvc

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));}

Page 19: Hanselman lipton asp_connections_ams304_mvc

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);

Page 20: Hanselman lipton asp_connections_ams304_mvc

Demo – TDD

Wasn’t this demo technically supposed to be first?

Page 21: Hanselman lipton asp_connections_ams304_mvc

Demo – Dynamic Data Controls

Not DDE. Scared you, didn’t I?

Page 22: Hanselman lipton asp_connections_ams304_mvc

Demo – ImageGen

It’s your thing. Do what you wanna do.

Page 23: Hanselman lipton asp_connections_ams304_mvc

Demo – Ruby View Engine& Python Controller

It’s a kinder, gentler Microsoft.No seriously. Hug?

Page 24: Hanselman lipton asp_connections_ams304_mvc

Demo – XML-RPC

SOAP is for dorks.

Page 25: Hanselman lipton asp_connections_ams304_mvc

Conclusion

• This is not Web Forms 4.0● It’s about alternatives. Car vs. Motorcycle.

• Simple or as complex as you like● Extend it, add IOC. Or not. If the shoe pinches, don’t

wear it.

• Fundamental● Part of System.Web and isn’t going anywhere.

• Plays Well With Others● Feel free to use NHibernate for Models, Brail for

Views and VB for Controllers. Be Happy.

Page 26: Hanselman lipton asp_connections_ams304_mvc

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!