You are previewing Beginning ASP.NET MVC 1.0.
O'Reilly logo
Beginning ASP.NET MVC 1.0

Book Description

ASP.NET MVC (Model View Framework) allows you to use ready-to-use MVC code so you can develop Web applications faster. This book?s cut-to-the-chase approach gets you up to speed on the new ASP.NET MVC without getting bogging you down in learning or re-learning ASP.NET itself. You?ll receive straightforward instruction on concepts, backed by real-world case studies and examples that offer practical solutions. Topics include test-driven development and unit testing, the principles of the MVC pattern, how to implement it, how to move from traditional ASP.NET Webforms to ASP.NET MVC, and much more.

Table of Contents

  1. Copyright
  2. About the Author
  3. About the Technical Editors
  4. Credits
  5. Acknowledgments
  6. Foreword
  7. Introduction
    1. The Philosophy of the Book
    2. Why C#?
    3. Who This Book Is For
    4. What This Book Covers
    5. How This Book Is Structured
    6. What You Need to Use This Book
    7. Conventions
    8. Source Code
    9. Errata
    10. p2p.wrox.com
  8. 1. The Model-View-Controller Pattern
    1. 1.1. The History of MVC
    2. 1.2. The Principles of MVC
    3. 1.3. How the MVC Pattern Flows
      1. 1.3.1. The Passive View
      2. 1.3.2. The Presentation Model
    4. 1.4. The Model-View-Presenter Pattern
    5. 1.5. Advantages of MVC over Traditional Web Development
      1. 1.5.1. Unit Testing
      2. 1.5.2. Test Driven Development
      3. 1.5.3. The Interface First Approach
    6. 1.6. Summary
    7. 1.7. Exercises
  9. 2. ASP.NET WebForms vs. ASP.NET MVC
    1. 2.1. Overview
    2. 2.2. Contrasting ASP.NET WebForms with ASP.NET MVC
      1. 2.2.1. Problems with ASP.NET WebForms
        1. 2.2.1.1. The Dependency on Environment Parameters
        2. 2.2.1.2. The Level of Control on Rendering Code
        3. 2.2.1.3. Abundant Repetitions
        4. 2.2.1.4. The Level of Testability
        5. 2.2.1.5. State Management
        6. 2.2.1.6. Adaption to Modern Development Patterns
      2. 2.2.2. How ASP.NET MVC Resolves Issues with ASP.NET WebForms
    3. 2.3. The Programming Model
      1. 2.3.1. The ASP.NET WebForms Programming Model
      2. 2.3.2. The ASP.NET MVC Programming Model
    4. 2.4. The Main Elements of ASP.NET Development
    5. 2.5. How ASP.NET, ASP.NET WebForms, and ASP.NET MVC Relate
    6. 2.6. The Implementation of the MVC Pattern in ASP.NET MVC
      1. 2.6.1. The Model in ASP.NET MVC
      2. 2.6.2. The Controller in ASP.NET MVC
      3. 2.6.3. The View in ASP.NET MVC
      4. 2.6.4. Routing in ASP.NET MVC
    7. 2.7. Summary
    8. 2.8. Exercise
  10. 3. Getting Started with ASP.NET MVC
    1. 3.1. Installing ASP.NET MVC
    2. 3.2. Creating an ASP.NET MVC Project
    3. 3.3. Examining the Solution Structure
      1. 3.3.1. The Controller
      2. 3.3.2. The View
      3. 3.3.3. The Model
      4. 3.3.4. The ASP.NET MVC Application Class
      5. 3.3.5. The Web Configuration File
      6. 3.3.6. The Content Files
      7. 3.3.7. The Script Files
    4. 3.4. Test Projects
    5. 3.5. An ASP.NET MVC Example
    6. 3.6. Summary
    7. 3.7. Exercises
  11. 4. The Model
    1. 4.1. What Microsoft Provides for the "M" in MVC
    2. 4.2. An Overview of the Model
    3. 4.3. Different Options for Building the Model
    4. 4.4. LINQ to SQL
    5. 4.5. ADO.NET Database Objects
    6. 4.6. ADO.NET Entity Framework
    7. 4.7. XML
    8. 4.8. Important Considerations about Creating Data Models
    9. 4.9. Third-Party Components and Tools
    10. 4.10. Summary
    11. 4.11. Exercise
  12. 5. The Controller
    1. 5.1. What the Controller Does
    2. 5.2. Creating a Controller
    3. 5.3. Defining an Action
      1. 5.3.1. Attributes That Control Action Definition
        1. 5.3.1.1. The NonAction Attribute
        2. 5.3.1.2. The ActionName Attribute
        3. 5.3.1.3. The AcceptVerbs Attribute
        4. 5.3.1.4. Building Your Own Attribute
    4. 5.4. Passing Data to the View
      1. 5.4.1. ViewData
        1. 5.4.1.1. A Strongly Typed Model Object
        2. 5.4.1.2. TempData
    5. 5.5. Retrieving Data from the Request
      1. 5.5.1. Action Parameters
        1. 5.5.1.1. Passing Simple Types to the Action
          1. 5.5.1.1.1. The Value Retrieved from the URL
          2. 5.5.1.1.2. The Value Retrieved from Post Data
        2. 5.5.1.2. Binding Complex Objects Using the Model Binder
          1. 5.5.1.2.1. Prefix
          2. 5.5.1.2.2. Include
          3. 5.5.1.2.3. Exclude
      2. 5.5.2. Binding Data Inside the Action
    6. 5.6. Types of Action Results
      1. 5.6.1. ViewResult
      2. 5.6.2. PartialViewResult
      3. 5.6.3. RedirectResult
      4. 5.6.4. RedirectToRouteResult
        1. 5.6.4.1. RedirectToAction
        2. 5.6.4.2. RedirectToRoute
      5. 5.6.5. JsonResult
      6. 5.6.6. JavaScriptResult
      7. 5.6.7. ContentResult
      8. 5.6.8. FileContentResult
      9. 5.6.9. EmptyResult
    7. 5.7. Using the Core ASP.NET Objects
    8. 5.8. Summary
    9. 5.9. Exercises
  13. 6. The View
    1. 6.1. The Responsibilities of the View
    2. 6.2. The Anatomy of a View
    3. 6.3. Creating a View with Visual Studio
      1. 6.3.1. Loosely Typed Views
        1. 6.3.1.1. View Page
        2. 6.3.1.2. View Master Pages and View Content Pages
        3. 6.3.1.3. View User Controls
      2. 6.3.2. Strongly Typed Views
    4. 6.4. Writing HTML the ASP.NET MVC Way
      1. 6.4.1. Link-Building Helpers
        1. 6.4.1.1. The ActionLink Method
          1. 6.4.1.1.1. String-Based Overloads
          2. 6.4.1.1.2. Lambda Expression-Based Overloads
        2. 6.4.1.2. The RouteLink Method
      2. 6.4.2. Form Helpers
        1. 6.4.2.1. Form Field Helpers
          1. 6.4.2.1.1. The TextBox Helper
          2. 6.4.2.1.2. The TextArea Helper
          3. 6.4.2.1.3. The Password Helper
          4. 6.4.2.1.4. The Hidden Helper
          5. 6.4.2.1.5. The CheckBox Helper
          6. 6.4.2.1.6. The RadioButton Helper
          7. 6.4.2.1.7. The DropDownList Helper
          8. 6.4.2.1.8. Autobinding the Item List
          9. 6.4.2.1.9. Autobinding the Selected Item and Specifying the Item List
          10. 6.4.2.1.10. Using the SelectList Class to Help Create the Options
          11. 6.4.2.1.11. The ListBox Helper
      3. 6.4.3. Validation Helpers
        1. 6.4.3.1. The ValidationMessage Helper
        2. 6.4.3.2. The ValidationSummary Helper
    5. 6.5. What about the rest?
    6. 6.6. Writing Your Own Helper Methods
    7. 6.7. A Shortcut for Creating Views
    8. 6.8. Summary
    9. 6.9. Exercises
  14. 7. Routing
    1. 7.1. Life before Routing
    2. 7.2. Key Concepts
    3. 7.3. The Anatomy of a Route
      1. 7.3.1. The URL Property
      2. 7.3.2. The Defaults Property
      3. 7.3.3. The Constraints Property
        1. 7.3.3.1. Regular Expression Constraints
        2. 7.3.3.2. The IRouteConstraint Constraint
      4. 7.3.4. The DataTokens Property
      5. 7.3.5. The RouteHandler Property
    4. 7.4. How to Register Routes
    5. 7.5. Easier Route Management with ASP.NET MVC
    6. 7.6. Debugging Routes
    7. 7.7. Summary
    8. 7.8. Exercises
  15. 8. Unit Testing Concepts
    1. 8.1. What Is Unit Testing?
      1. 8.1.1. The Benefits of Unit Testing
    2. 8.2. The Structure of a Unit Test
      1. 8.2.1. The Four Phases of a Test
      2. 8.2.2. Fixtures
      3. 8.2.3. The Order of Execution
      4. 8.2.4. Attributes That Control Testing
      5. 8.2.5. Result Verification
        1. 8.2.5.1. Assertions
        2. 8.2.5.2. Expected Exceptions
      6. 8.2.6. Code Coverage
    3. 8.3. Writing Tests with Visual Studio
      1. 8.3.1. The Visual Studio Testing User Interface
        1. 8.3.1.1. The Test Project Template
        2. 8.3.1.2. The Test Tools Toolbar
        3. 8.3.1.3. The Add New Test Dialog
        4. 8.3.1.4. Test Management Windows
        5. 8.3.1.5. Code Coverage
      2. 8.3.2. Writing Your First Test Class
    4. 8.4. Testing Classes That Depend on External Components
      1. 8.4.1. Patterns That Make Testing Easier
        1. 8.4.1.1. Dependency Injection
        2. 8.4.1.2. Inversion of Control Containers
          1. 8.4.1.2.1. Configuring Ninject
          2. 8.4.1.2.2. Getting an Instance of a Component with Ninject
      2. 8.4.2. Using a Test Double
      3. 8.4.3. Mock Objects
    5. 8.5. Summary
    6. 8.6. Exercises
  16. 9. Testing ASP.NET MVC Applications
    1. 9.1. Creating a Test Project for ASP.NET MVC
    2. 9.2. Testing without Mocking
      1. 9.2.1. Testing Actions That Render Something
      2. 9.2.2. Testing Actions That Redirect to Another Action
    3. 9.3. System.Web.Abstractions
    4. 9.4. Testing with Mocking
    5. 9.5. Testing Routes
    6. 9.6. Putting It All Together
      1. 9.6.1. Analyzing a Legacy Application
      2. 9.6.2. Refactoring to Testable
        1. 9.6.2.1. Step 1 — The Model Object
        2. 9.6.2.2. Step 2 — The Data Access Layer Interface
        3. 9.6.2.3. Step 3 — The Concrete DAL Implements the Interface
        4. 9.6.2.4. Step 4 — Writing the Controller Using the DI Pattern
      3. 9.6.3. Testing the Application
    7. 9.7. Developing with a TDD Approach
      1. 9.7.1. Requirements
      2. 9.7.2. Testing for Christmas Day
        1. 9.7.2.1. The Test Fails
        2. 9.7.2.2. The Test Passes
      3. 9.7.3. Testing for Any Other Day
      4. 9.7.4. Testing for New Year's Day
      5. 9.7.5. It's Refactoring Time
    8. 9.8. Summary
    9. 9.9. Exercises
  17. 10. Components
    1. 10.1. Why Are There No Server Controls?
    2. 10.2. Server Controls
      1. 10.2.1. A Simple Form Control
      2. 10.2.2. Components with Rendering Only
      3. 10.2.3. Controls with Databinding
    3. 10.3. Using Partial Views
    4. 10.4. Writing a Custom HtmlHelper
    5. 10.5. Rendering the Result of an Action
    6. 10.6. Writing Client-Side Components with JavaScript
    7. 10.7. When to Use Which Option
    8. 10.8. Summary
    9. 10.9. Exercises
  18. 11. Action Filters
    1. 11.1. What Is an Action Filter?
    2. 11.2. Types of Filters
    3. 11.3. The Core Filters
      1. 11.3.1. The HandleError Filter
      2. 11.3.2. The Authorize Filter
      3. 11.3.3. The ValidateInput Filter
      4. 11.3.4. The ValidateAntiForgeryToken Filter
      5. 11.3.5. The OutputCache Filter
    4. 11.4. Building a Custom Action Filter
      1. 11.4.1. The Base Class: ActionFilterAttribute
        1. 11.4.1.1. OnActionExecuting
        2. 11.4.1.2. OnActionExecuted
        3. 11.4.1.3. OnResultExecuting
        4. 11.4.1.4. OnResultExecuted
    5. 11.5. Controller-Scoped Filters
    6. 11.6. The Filter Execution Order
    7. 11.7. Using Action Filters
      1. 11.7.1. Canceling the Execution of an Action
      2. 11.7.2. Adding More Data for the View
        1. 11.7.2.1. Supplying Data to a Master Page
        2. 11.7.2.2. Generating Data for a Partial View
    8. 11.8. Summary
    9. 11.9. Exercises
  19. 12. AJAX
    1. 12.1. What Is AJAX?
    2. 12.2. ASP.NET AJAX
    3. 12.3. jQuery
    4. 12.4. AJAX in ASP.NET MVC
      1. 12.4.1. Adding AJAX References
    5. 12.5. Principles of AJAX Development in ASP.NET MVC Applications
    6. 12.6. Putting It into Action: Using AJAX in ASP.NET MVC
    7. 12.7. Summary
    8. 12.8. Exercises
  20. 13. Deployment
    1. 13.1. ASP.NET Deployment Overview
    2. 13.2. ASP.NET MVC Hosting Options
      1. 13.2.1. GAC Installation
      2. 13.2.2. Assembly Deployment
    3. 13.3. Hosting Prerequisites
    4. 13.4. The .NET Security Policy
    5. 13.5. The Web Platform Installer
    6. 13.6. Publishing Web Applications
    7. 13.7. Summary
  21. 14. Leveraging ASP.NET WebForm Features
    1. 14.1. Caching
      1. 14.1.1. Caching in ASP.NET
      2. 14.1.2. Caching in ASP.NET MVC
        1. 14.1.2.1. The OutputCache Action Filter
        2. 14.1.2.2. Cache Variance
          1. 14.1.2.2.1. VaryByParam
          2. 14.1.2.2.2. VaryByHeader
          3. 14.1.2.2.3. VaryByContentEncoding
          4. 14.1.2.2.4. VaryByCustom
        3. 14.1.2.3. The Cache Profile
        4. 14.1.2.4. Cache Dependency
    2. 14.2. Validation
      1. 14.2.1. Validation in ASP.NET MVC
      2. 14.2.2. Validation with Model State
    3. 14.3. Master Pages
    4. 14.4. Other Features
      1. 14.4.1. Sitemaps
      2. 14.4.2. The Profile System
      3. 14.4.3. Health Monitoring
      4. 14.4.4. Server Controls
    5. 14.5. Summary
    6. 14.6. Exercises
  22. 15. Authentication and Authorization
    1. 15.1. Principles of Authentication and Authorization
    2. 15.2. Authentication and Authorization in ASP.NET
      1. 15.2.1. The Membership Provider
      2. 15.2.2. The Role Provider
    3. 15.3. Authentication and Authorization in ASP.NET MVC
      1. 15.3.1. Configuring Your Application to Use Authorization and Authentication
        1. 15.3.1.1. <authentication />
        2. 15.3.1.2. <authorization />
        3. 15.3.1.3. <membership />
        4. 15.3.1.4. <roleManager />
      2. 15.3.2. Custom Membership and Role Providers
      3. 15.3.3. Limiting Access to Resources with the Authorize Action Filter
      4. 15.3.4. Authentication and Authorization in Action in ASP.NET MVC
        1. 15.3.4.1. The Principles of Using AccountController
        2. 15.3.4.2. Setting Up Registration
        3. 15.3.4.3. Handling Logons
        4. 15.3.4.4. Changing the Password
    4. 15.4. Summary
    5. 15.5. Exercises
  23. 16. Extending ASP.NET MVC
    1. 16.1. Introduction to Extensibility
    2. 16.2. Areas of Extensibility
    3. 16.3. Route Handlers
      1. 16.3.1. Writing a Custom Route Handler
      2. 16.3.2. A Generic WebFormRouteHandler
    4. 16.4. The Controller Factory
      1. 16.4.1. Anatomy of a Controller Factory
      2. 16.4.2. Using the Ninject Custom Controller Factory
        1. 16.4.2.1. Using the Controller Factory that Comes with MvcContrib
        2. 16.4.2.2. Using the Controller Factory that Comes with Ninject v2.0
    5. 16.5. View Engines
      1. 16.5.1. Writing a Custom View Engine
        1. 16.5.1.1. IView
        2. 16.5.1.2. IViewEngine
        3. 16.5.1.3. Creating a Simple Custom View Engine
          1. 16.5.1.3.1. Step 1 — Choose Your Syntax
          2. 16.5.1.3.2. Step 2 — Implement the Parser and Rendering Engine
          3. 16.5.1.3.3. Step 3 — Implement the View Factory
          4. 16.5.1.3.4. Step 4 — Custom View Syntax
          5. 16.5.1.3.5. Step 5 — Test the View Engine
      2. 16.5.2. Using a Custom View Engine
      3. 16.5.3. Alternative View Engines
        1. 16.5.3.1. The Brail View Engine
          1. 16.5.3.1.1. Setting Up the Brail View Engine
          2. 16.5.3.1.2. Adding Brail References
          3. 16.5.3.1.3. Adding to Web.Config
          4. 16.5.3.1.4. Registering the Brail View Engine
          5. 16.5.3.1.5. Brail's View Syntax
          6. 16.5.3.1.6. Accessing Brail Resources
        2. 16.5.3.2. NVelocity
          1. 16.5.3.2.1. Setting Up the NVelocity View Engine
          2. 16.5.3.2.2. NVelocity References
          3. 16.5.3.2.3. Changing Web.Config
          4. 16.5.3.2.4. Registering the NVelocity View Engine
          5. 16.5.3.2.5. The NVelocity View Syntax
          6. 16.5.3.2.6. Accessing NVelocity Resources
        3. 16.5.3.3. Spark
          1. 16.5.3.3.1. Setting Up the Spark View Engine
          2. 16.5.3.3.2. Adding Spark References
          3. 16.5.3.3.3. Changing Web.Config
          4. 16.5.3.3.4. Registering the Spark View Engine
          5. 16.5.3.3.5. The Spark View Syntax
          6. 16.5.3.3.6. Accessing Spark Resources
        4. 16.5.3.4. The NHaml View Engine
          1. 16.5.3.4.1. Setting Up the NHaml View Engine
          2. 16.5.3.4.2. Setting NHaml References
          3. 16.5.3.4.3. Changing Web.Config
          4. 16.5.3.4.4. Registering the NHaml View Engine
          5. 16.5.3.4.5. The NHaml View Syntax
          6. 16.5.3.4.6. Accessing NHaml Resources
    6. 16.6. Minor Extensibility Points
      1. 16.6.1. ActionMethodSelectorAttribute
      2. 16.6.2. TempDataProvider
      3. 16.6.3. Custom ActionResult
    7. 16.7. Summary
    8. 16.8. Exercises
  24. 17. Migrating from ASP.NET WebForms
    1. 17.1. Why Migrate?
    2. 17.2. Overview of the Migration Process
    3. 17.3. Fundamental Similarities between ASP.NET WebForms and ASP.NET MVC
      1. 17.3.1. Authentication and Authorization Similarities
      2. 17.3.2. Provider Similarities
      3. 17.3.3. HttpModule and HttpHandler
    4. 17.4. Fundamental Differences between ASP.NET WebForms and ASP.NET MVC
      1. 17.4.1. The ViewState Difference
      2. 17.4.2. Differences in Using Server Controls
      3. 17.4.3. Code Model Differences
      4. 17.4.4. Event Model Differences
      5. 17.4.5. Differences in Using URLs
      6. 17.4.6. Differences in the Separation of Resources
      7. 17.4.7. Validation Differences
      8. 17.4.8. Differences in Support for AJAX
    5. 17.5. Replacing Controls During Migration to ASP.NET MVC
      1. 17.5.1. Migrating a Simple WebForms Application
        1. 17.5.1.1. WebForms Implementation
        2. 17.5.1.2. The MVC Implementation
    6. 17.6. Summary
    7. 17.7. Exercise
  25. 18. Case Study 1
    1. 18.1. The WroxBlog Overview
    2. 18.2. The WroxBlog Models
      1. 18.2.1. The WroxBlog Database Structure
      2. 18.2.2. The LINQ to SQL Model
      3. 18.2.3. The Services
        1. 18.2.3.1. The Blog Service
        2. 18.2.3.2. The Post Service
        3. 18.2.3.3. The Category Service
        4. 18.2.3.4. The Comment Service
        5. 18.2.3.5. The Collection Classes
        6. 18.2.3.6. Binding the Services
    3. 18.3. The WroxBlog Controllers
      1. 18.3.1. Implementing HomeController
      2. 18.3.2. Implementing PostController
      3. 18.3.3. Implementing CategoryController
    4. 18.4. The WroxBlog Views
      1. 18.4.1. The Site Master
      2. 18.4.2. Adding the Categories Control
      3. 18.4.3. Adding the Post Control
      4. 18.4.4. Adding the Posts Control
      5. 18.4.5. Adding the Comment Control
      6. 18.4.6. Adding the Comments Control
      7. 18.4.7. Adding the CommentForm Control
      8. 18.4.8. Creating the Home View
      9. 18.4.9. Adding the About View
      10. 18.4.10. Creating the IndividualPost View
      11. 18.4.11. Creating the CategoryIndex View
    5. 18.5. WroxBlog Routing
    6. 18.6. Check It Out
    7. 18.7. Summary
    8. 18.8. Exercises
  26. 19. Case Study 2
    1. 19.1. User Stories (aka Requirements)
    2. 19.2. The WroxGallery External Libraries
      1. 19.2.1. Flickr.NET
    3. 19.3. Using the TDD Approach
    4. 19.4. Building the WroxGallery Model
      1. 19.4.1. Creating the Data Model
      2. 19.4.2. Implementing the WroxGallery Services
    5. 19.5. The WroxGallery Controllers
      1. 19.5.1. The Home Controller
        1. 19.5.1.1. The Album Filter
        2. 19.5.1.2. The TitleFilter
      2. 19.5.2. WroxGallery Account Controller
      3. 19.5.3. Building the Admin Controller
    6. 19.6. Configuring the IoCC
    7. 19.7. Creating the WroxGallery Views
      1. 19.7.1. Creating the Master Pages
      2. 19.7.2. Adding the Content Pages
    8. 19.8. Using AJAX and jQuery
      1. 19.8.1. The Lightbox Plug-In
      2. 19.8.2. The Autocomplete Plug-In
    9. 19.9. Running More Tests
    10. 19.10. The WroxGallery in Action
    11. 19.11. Summary
    12. 19.12. Exercise
  27. A. Resources
    1. A.1. Communities
    2. A.2. Blogs
    3. A.3. Books
    4. A.4. Tools
  28. B. Exercise Solutions
    1. B.1. Chapter 1
      1. B.1.1. Exercise 1 Solution
      2. B.1.2. Exercise 2 Solution
      3. B.1.3. Exercise 3 Solution
    2. B.2. Chapter 2
      1. B.2.1. Exercise 1 Solution
    3. B.3. Chapter 3
      1. B.3.1. Exercise 1 Solution
      2. B.3.2. Exercise 2 Solution
    4. B.4. Chapter 4
      1. B.4.1. Exercise 1 Solution
    5. B.5. Chapter 5
      1. B.5.1. Exercise 1 Solution
      2. B.5.2. Exercise 2 Solution
      3. B.5.3. Exercise 3 Solution
      4. B.5.4. Exercise 4 Solution
    6. B.6. Chapter 6
      1. B.6.1. Exercise 1 Solution
      2. B.6.2. Exercise 2 Solution
      3. B.6.3. Exercise 3 Solution
      4. B.6.4. Exercise 4 Solution
      5. B.6.5. Exercise 5 Solution
    7. B.7. Chapter 7
      1. B.7.1. Exercise 1 Solution
      2. B.7.2. Exercise 2 Solution
      3. B.7.3. Exercise 3 Solution
    8. B.8. Chapter 8
      1. B.8.1. Exercise 1 Solution
      2. B.8.2. Exercise 2 Solution
      3. B.8.3. Exercise 3 Solution
      4. B.8.4. Exercise 4 Solution
    9. B.9. Chapter 9
      1. B.9.1. Exercise 1 Solution
      2. B.9.2. Exercise 2 Solution
      3. B.9.3. Exercise 3 Solution
      4. B.9.4. Exercise 4 Solution
      5. B.9.5. Exercise 5 Solution
    10. B.10. Chapter 10
      1. B.10.1. Exercise 1 Solution
      2. B.10.2. Exercise 2 Solution
      3. B.10.3. Exercise 3 Solution
    11. B.11. Chapter 11
      1. B.11.1. Exercise 1 Solution
      2. B.11.2. Exercise 2 Solution
      3. B.11.3. Exercise 3 Solution
    12. B.12. Chapter 12
      1. B.12.1. Exercise 1 Solution
      2. B.12.2. Exercise 2 Solution
    13. B.13. Chapter 13
    14. B.14. Chapter 14
      1. B.14.1. Exercise 1 Solution
      2. B.14.2. Exercise 2 Solution
    15. B.15. Chapter 15
      1. B.15.1. Exercise 1 Solution
      2. B.15.2. Exercise 2 Solution
    16. B.16. Chapter 16
      1. B.16.1. Exercise 1 Solution
      2. B.16.2. Exercise 2 Solution
      3. B.16.3. Exercise 3 Solution
      4. B.16.4. Exercise 4 Solution
      5. B.16.5. Exercise 5 Solution
    17. B.17. Chapter 17
      1. B.17.1. Exercise 1 Solution
    18. B.18. Chapter 18
      1. B.18.1. Exercise 1 Solution
      2. B.18.2. Exercise 2 Solution
    19. B.19. Chapter 19