In the past, all of our ASP.NET books taught Web Forms programming for Windows. But now, this book helps you teach your students how to develop ASP.NET Core MVC web apps that can run on any platform.
As usual, we present all the pieces…model classes, controller classes, Razor views, Bootstrap CSS classes, EF Core, and more…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 HTML5 and CSS3 and the first 3 sections of Murach’s C#.
You are currently on the Murach site for instructors. To buy this book, please visit our retail site.
Just a note to say WOW! 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.”
To give you 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, work with a database, and use 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. It’s also a great way to introduce students to the complexity of a realistic ASP.NET Core MVC app.
This 4-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.
Note: If you want your students to use Visual Studio Code (VS Code) instead of the Visual Studio IDE, you can use chapter 17 as a supplement to chapter 2. That way, your students can use VS Code throughout this book.
To program using this book, your students can 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, installing Visual Studio installs all of the software you need, except SQL Server Express LocalDB. Since LocalDB isn’t supported on macOS, we recommend using 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 HTML5 and CSS3 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.
But even if you don’t use Murach’s HTML and CSS3 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.
“Just a note to say WOW! 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, and most notably, loads of important information all in one place.”
- 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
“I'm wrapping up reading this book, and I was very pleased with two facts: (1) I was waiting for a Murach MVC book for a long time; and (2) It was worth waiting for!!! I will absolutely be using the book where I teach!
- Ilya Sharkansky, Trainer, Philadelphia, Pennsylvania
“Murach has a stellar reputation for producing excellent technical books and training material, and this title on ASP.NET Core MVC development is no different. I found the coverage of the topic to be perfect for my training classes, and the end-of-chapter exercises all worked. My students were equally happy with the book.”
- Mark Dunn, Trainer, Georgia
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
Three ASP.NET programming models for web apps
Some web components of .NET 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 Startup.cs file configures the middleware for an app
How to start a new web app
How to select a template
How to set up the MVC folders
How to add a controller
How to add a Razor view
How to configure an MVC web app
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
How to work with a strongly-typed view
The Future Value app after handling GET and POST requests
How to add a CSS style sheet
How to add a Razor layout, view start, and view
The code for a Razor layout, view start, and view
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, images, and jumbotrons
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 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 an 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 view model classes
The Details() action method
The Home/Index view
The Home/Details 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 Home controller
The layout
The Home/Index view
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 updated session class
The updated Home controller
The updated 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
An action method that binds to primitive types
An action method that binds to complex types
Two ways to code a submit button
How to use a submit button to post a name/value pair
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 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
How to use the unit of work pattern
The end user pages
The admin user pages
The folders and files
Extension methods for sessions and strings
The generic QueryOptions class
The generic Repository class
The custom route and the GridDTO class
The RouteDictionary class
The GridBuilder class
The Author/List view model and the Author controller
The Author/List view
The custom route and the BooksGridDTO class
The FilterPrefix class and the updated RouteDictionary class
The BooksGridBuilder class
The BookQueryOptions and BookstoreUnitOfWork classes
The Book/List view model and the Book controller
The Book/List view
Extension methods for cookies
The user interface
The model classes
The Cart controller
The Cart/Index view
The user interface
The SearchData and SearchViewModel classes
The Search() action methods of the Book controller
The Delete() action method of the Genre controller
How to configure your app for DI
How to use DI with controllers
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 BookControllerTests class
The AdminBookControllerTests class
The CartTests class
How to register and use tag helpers
How tag helpers compare to HTML 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 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
How view components can simplify an app
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 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 SQLit
If you haven’t ever seen the supporting courseware that we provide for a book, please go to About our Courseware.
If you’re familiar with our courseware overall, here’s a quick summary of the courseware for this book. For a detailed description in PDF format, please read the Instructor’s Summary.
Appendixes A (Windows) and B (macOS) give your students complete instructions for downloading and installing these items on their own computers.
To view the "Frequently Asked Questions" for this book in a PDF, just click on this link: View the questions
Then, if you have any questions that aren't answered here, please email us. Thanks!
To view the corrections for this book in a PDF, just click on this link: View the corrections
Then, if you find any other errors, please email us so we can correct them in the next printing of the book. Thank you!
This is our site for college instructors. To buy Murach books, please visit our retail site.