This book is the ideal way to teach your students how to develop ASP.NET Core MVC web apps. As usual, we present all the pieces in a logical way that helps your students see the big picture even as they’re focusing on the coding details. The only prerequisites are skills comparable to those presented in the first 8 chapters of Murach’s HTML and CSS and the first 3 sections of Murach’s C#.
The Canvas course file contains all the objectives, quizzes, assignments, and slides that you need to run an effective course. It only takes a few clicks to import it into the Canvas LMS. Then, you can customize it for your course. Learn more.
I have been very pleased with the MVC book. My students and I have learned a great deal, and I have recommended it to some other instructors from other colleges.”
To give your students a solid foundation as quickly as possible, this 5-chapter section shows how to use Visual Studio to design, code, and test multi-page ASP.NET Core apps that use the MVC pattern to structure the code, EF Core to work with a database, and Bootstrap to make the apps look great on all screen sizes. After that, your students will be ready to review and expand upon what they’ve learned in this section so they can raise their skills to a professional level.
This 8-chapter section covers the ASP.NET Core MVC skills that web developers use every day.
The final chapter in this section presents an extensive, real-world website. Having your students study this website is a great way for them to gain a deep understanding of how all their new skills work together in a realistic ASP.NET Core MVC app.
This 5-chapter section covers advanced skills that take your students to the next level. Here, they’ll learn how to:
If you don’t have time for all of these chapters (or any of them), that’s OK because sections 1 and 2 are a great course by themselves. In that case, your students can refer to the chapters in section 3 on their own to learn new skills as they need them.
To get the most from this book, your students need to install Visual Studio with the “.NET Core” workload as described in appendix A (Windows) or B (macOS).
On Windows, this installs all the software needed, including:
On macOS, this workload doesn’t include SQL Server Express LocalDB, but that’s OK because your students can use SQLite instead as described in appendix B.
The first prerequisite is that your students know the basics of HTML/CSS. If you use Murach’s HTML and CSS in your introductory HTML/CSS course, the first 8 chapters provide the skills they need.
The second prerequisite is that your students know the basics of C#. If you use Murach’s C# in your introductory C# course, the first 3 sections provide the skills they need.
If you don’t use Murach’s HTML and CSS or Murach’s C# for your introductory courses, we encourage you to include these books on your supplemental reading list. They make ideal references if your students come across HTML/CSS or C# code that they don’t understand.
This edition includes a new chapter that shows how to deploy a web app to the cloud. In addition, the entire book has been thoroughly updated to integrate new features and best practices from C# 10, .NET 6, ASP.NET Core MVC 6.0, Bootstrap 5.0, EF Core 6.0, and Visual Studio 2022. For a more detailed description of what’s new, please view the PDF summary.
“For years I had been looking for a book to teach a one-semester Microsoft ASP.NET MVC course. The publisher worked directly with me to get the instructor materials and an electronic version so I could have it ready before the semester started. Overall, I was very pleased with the book and will use it for years to come.”
- Posted at an online bookseller
“Your launch of the ASP.NET Core MVC text is a much-needed contribution to the topic of ASP.NET Core, as well as server-side web development in general. A well-articulated and effective progression into the topic.”
- K.S., College Instructor, Chicago, Illinois
“I have been very pleased with the MVC book. My students and I have learned a great deal, and I have recommended it to some other instructors from other colleges.”
- Andy Bangsberg, IT Web & Software Developer
- Instructor, Wisconsin Indianhead Technical College
“Not only is this a great book on ASP.NET Core MVC, but it’s the best programming book I’ve read on any subject. I love the format with the paired pages. The code is error-free and the numerous example applications are helpful to study. The explanations are clear and avoid some of the overly complicated word salads other books like to give.”
- Posted at an online bookseller
“I normally don’t write in or leave reviews on products, but I felt compelled to do so with this book as it’s the first one I went through that was actually fun from start to finish (and I’ve read many, many programming books before).”
- Shannon Fairchild, Senior Software Developer, Ontario, Canada
“I have been programming in ASP.NET Webforms and MVC for over 15 years and this book is hands-down the best programming book I’ve ever purchased.”
- Posted at an online bookseller
“This book is a solid introduction to ASP.NET Core and can really help a beginner get up to speed in this framework. You can get a lot out of doing the exercises.”
- Posted at an online bookseller
“At last, a dot net MVC book that explains everything clearly!”
- Posted at an online bookseller
View the table of contents for this book in a PDF: Table of Contents (PDF)
Click on any chapter title to display or hide its content.
The components of a web app
How static web pages are processed
How dynamic web pages are processed
An introduction to the MVC pattern
Four ASP.NET programming models for web apps
Some web components of .NET Framework and .NET Core
An introduction to ASP.NET Core middleware
How state works in a web app
An introduction to Visual Studio
An introduction to Visual Studio Code
How coding by convention works
How a controller passes a model to a view
How a view uses Razor code, tag helpers, and Bootstrap CSS classes
How the Program.cs file configures the middleware for an app
How to start a new web app
How to configure a web app
How to set up the MVC folders
How to add a controller
How to add a Razor view
How to configure the middleware for an HTTP request pipeline
How to run a web app
How to find and fix errors
How to add a model
How to add a Razor view imports page
How to code a strongly-typed view
How to handle GET and POST requests
The Future Value app after handling GET and POST requests
How to add a CSS style sheet
How to add a Razor layout and view start
The code for a Razor layout and view start
How to add a Razor view when using a layout with a view start
How to set data validation rules in the model
The model class with data validation
How to check the data validation
How to display validation error messages
The Future Value app after validating data
A responsive user interface
How to add client-side libraries such as Bootstrap and jQuery
How to manage client-side libraries with LibMan
How to enable client-side libraries
The classes of the Bootstrap grid system
How the Bootstrap grid system works
How to work with forms
How to work with buttons and images
How to work with margins and padding
The code for the view of the Future Value app
How to format HTML tables
How to align and capitalize text
How to provide context
How to work with button groups
How to work with icons and badges
How to work with button dropdowns
How to work with list groups
How to work with alerts and breadcrumbs
How to create navs
How to create navbars
How to position navbars
The pages of the app
The folders and files of the app
How to add EF Core to your project
How to create a DbContext class
How to seed initial data
How to add a connection string
How to enable dependency injection
How to use migrations to create the database
How to select data
How to insert, update, and delete data
How to view the generated SQL statements
The Home controller
The Home/Index view
The Movie controller
The Movie/Edit view
The Movie/Delete view
How to relate one entity to another
How to update the DbContext class and the seed data
How to use migrations to update the database
How to select related data and display it on the Movie List page
How to display related data on the Add and Edit Movie pages
How to make URLs lowercase with a trailing slash
How to add a slug
How to run a web app
How to use the Hot Reload feature
How to use the browser’s developer tools
How to use the Internal Server Error page
How to use the Exception Helper
How to use breakpoints
How to work in break mode
How to monitor variables and expressions
How to use tracepoints
How to configure the default route
How the default route works
How to code a simple controller and its actions
How to code a controller that uses the id segment
How to include static content in a route
How to work with multiple routing patterns
How to change the routing for an action
More skills for changing the routing for an action
How to change the routing for a controller
How to set up areas
How to associate controllers with areas
How to work with code blocks and inline expressions
How to code inline loops
How to code inline conditional statements
The starting folders and files for an app
How to code controllers that return views
How to create a default layout and enable tag helpers
How to use tag helpers to generate URLs for links
Three views that use the default layout and tag helpers
The three views displayed in a browser
More tag helpers for generating URLs for links
How to format numbers in a view
How to pass a model to a view
How to display model properties in a view
How to bind model properties to HTML elements
How to bind a list of items to a element
How to display a list of model objects
How to create and apply a layout
How to nest layouts
How to use view context
How to use sections
The user interface for customers
The user interface for administrators
An introduction to ActionResult subtypes
How to return ActionResult objects
How to use the ViewData property
How to use the ViewBag property
The user interface
The model layer
The Home controller
The layout
The Home/Index view
How to create a view model
The updated Index() action method
The updated Home/Index view
How to use the ActionResult classes for redirection
How to use the Post-Redirect-Get pattern
How to get started with TempData
How to use methods of the TempData dictionary
The user interface
The Home/Index view
The Details() action method of the Home controller
The Home/Details view
The Add() action method of the Favorites controller
The layout view
Six ways to maintain state
An introduction to session state
How to configure an app to use session state
How to work with session state items in a controller
How to get session state values in a view
How to use JSON to store objects in session state
How to extend the ISession interface
How to use a wrapper class
The user interface
The session classes
The view model
The Home controller
The layout
The Home/Details view
The Favorites controller
The Favorites/Index view
How to work with session cookies
How to work with persistent cookies
The cookies class
The Home controller
The Favorites controller
How to use controller properties to retrieve GET and POST data
How to use model binding to retrieve GET and POST data
How to use model binding with complex types
How to use model binding with nested complex types
How to use a submit button to post a value
How to post an array to an action method
How to control the source of bound values
How to control which values are bound
The user interface
The entity classes
The database context class
A utility class for filtering
The Home controller
The layout
The Home/Index view
The Home/Add view
The default data validation provided by model binding
How to use data attributes for validation
A Registration page with data validation
How to format validation messages with CSS
How to check validation state and use code to set validation messages
How to display model-level and property-level validation messages
How to enable client-side validation
How to create a custom data attribute
How to pass values to a custom data attribute
How to check multiple properties
How to add data attributes to the generated HTML
How to add a validation method to the jQuery validation library
How to work with remote validation
The user interface and CSS
The Customer and RegistrationContext classes
The MinimumAgeAttribute class
The minimum-age JavaScript file
The Validation and Register controllers
The layout
The Register/Index view
How to code entity and DB context classes
How to configure the database
How to manage configuration files
EF commands for working with a database
How to use EF migration commands
How entities are related
How to configure a one-to-many relationship
How to configure a one-to-one relationship
How to configure a many-to-many relationship
How to seed data in the linking table of a many-to-many relationship
How to control delete behavior
The entity classes
The context and configuration classes
How to generate DB context and entity classes
How to configure a generated DB context class
How to modify a generated entity class
How to query data
How to work with projections and related entities
How to insert, update, and delete data
How to check for concurrency conflicts
How handle a concurrency exception
How to code a data access class
How to use a generic query options class
How to use the repository pattern
The end user pages
The admin user pages
The folders and files
Extension methods for strings
The generic QueryOptions class
The generic Repository class
The user interface and custom route
The abstract GridData class
The AuthorGridData subclass
The Author/List view model and the Author controller
The Author/List view
The user interface and custom route
The BookGridData subclass
The Book/List view model and the Book controller
The Book/List view
Extension methods for session and cookies
The user interface
The model classes
The Cart controller
The Cart/Index view
The BookRepository subclass
The Related Books page
The Delete() and Related() action methods
How to configure your app for DI
How to use DI with controllers
How to create an interface for an existing class
How to use DI with an HttpContextAccessor object
How to use DI with action methods
How to use DI with views
How unit tests work
How to add an xUnit project to a solution
How to write a unit test
How to run a unit test
How to use a fake repository object
How to use a fake TempData object
How to work with mock objects
How to mock a repository object
How to mock a TempData object
How to mock an HttpContextAccessor object
The Test Explorer
The Usings.cs file
The BookControllerTests class
The AdminBookControllerTests class
The CartTests class
How to use tag helpers
How to register tag helpers
How to create a custom tag helper
How to create a tag helper for a non-standard HTML element
How to use extension methods with tag helpers
How to control the scope of a tag helper
How to use a tag helper to add elements
How to use properties with a tag helper
How to work with the model property that an element is bound to
How to use a ViewContext object with a tag helper
How to use dependency injection with a tag helper
How to create a conditional tag helper
How to generate URLs in a tag helper
How to create and use a partial view
How to pass data to a partial view
How to create and use a view component
How to pass data to a view component
The Book Catalog page
The updated ActiveNavbar tag helper
The layout
The Book/List view
Three types of authentication
How individual user account authentication works
An introduction to ASP.NET Identity
How to restrict access to controllers and actions
How to add Identity classes to the DB context
How to add Identity tables to the database
How to configure the middleware for Identity
How to add Log In/Out buttons and links to the layout
How to start the Account controller
The Register view model
The Account/Register view
The Register() action method for POST requests
The LogOut() action method for POST requests
The Login view model
The Account/Login view
The LogIn() action method for POST requests
Properties and methods for working with roles
The User entity and view model
The User controller and its Index() action method
The User/Index view
Other action methods of the User controller
The code that restricts access
How to seed roles and users
How to change a user’s password
How to add more user registration fields
How work with publish profiles
How to work with the Publish wizard
How to create a publish profile for the file system
How to deploy to a publish folder
How to change the publish folder
How to get started with Azure
How to create a publish profile for an Azure App Service
How to deploy to the Azure App Service
How to add an Azure SQL Database to a publish profile
How to configure a connection string and migrations in a publish profile
How to deploy a data-driven app to the Azure App Service
An introduction to the Azure portal
How to delete an Azure App Service
How to install VS Code
How to open and close a project folder
How to view and edit files
How to run and stop a project
How to create the database for a project
A summary of .NET EF Core commands
How to create a new project
How to add NuGet packages to a project
How to work with the folders and files
How to install and manage client-side libraries
How to set a breakpoint
How to work in break mode
How to install Visual Studio
How to install the source code for this book
How to create the databases for this book
How to install Visual Studio
How to install the source code for this book
Problems and solutions when using macOS with this book
How to install and use DB Browser for SQLite
If you haven’t ever seen the supporting courseware that we provide for a book, please go to About our Courseware.
Appendixes A (Windows) and B (macOS) give your students complete instructions for downloading and installing these items on their own computers.
For a more detailed description of the courseware for this book, please read the Instructor’s Summary.
On this page, we’ll be posting answers to the questions that come up most often about this book. So if you have any questions that you haven’t found answered here at our site, please email us. Thanks!
There are no book corrections that we know of at this time. But if you find any, please email us, and we’ll post any corrections that affect the technical accuracy of the book here. Thank you!
This is our site for college instructors. To buy Murach books, please visit our retail site.