260 likes | 616 Views
AMS304: Introduction to the ASP.NET Model View Controller (MVC) Framework. Scott Hanselman Eilon Lipton Microsoft Microsoft scottha@microsoft.com elipton@microsoft.com. MVC. Intro. Goodness. Maintain Clean Separation of Concerns Easy Testing
E N D
AMS304: Introduction to the ASP.NET Model View Controller (MVC) Framework Scott Hanselman Eilon Lipton Microsoft Microsoft scottha@microsoft.comelipton@microsoft.com
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. • 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.
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.
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. • Controller sets data on the View • Loosely typed or strongly typed data
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…
MVC How To TEST IT
Interfaces and TDD • MockableIntrinsics • IHttpContext, IHttpResponse, IHttpRequest • Extensibility • IController • IControllerFactory • IRouteHandler • IView • IViewFactory
Testing Controller Actions • No requirement to mock out full ASP.NET runtime. [TestMethod] public void ShowPostsDisplayPostView() { TestPostRepository repository = new TestPostRepository(); TestViewFactoryviewFactory = 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 { IControllerCreateController(IHttpContext context, RouteDatarouteData, 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 { IViewCreateView(IHttpContext context, RouteDatarouteData, string viewName, string layoutName, object viewData); } Inside controller class: ViewFactory = new XmlViewFactory(...); RenderView("foo", myData);
Demo – TDD Wasn’t this demo technically supposed to be first?
Demo – Dynamic Data Controls • Not DDE. Scared you, didn’t I?
Demo – ImageGen It’s your thing. Do what you wanna do.
Demo – Ruby View Engine& Python Controller • It’s a kinder, gentler Microsoft.No seriously. Hug?
Demo – XML-RPC • SOAP is for dorks.
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.
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!