Preface
Contents
1 Introduction
2 Prepare the Development Environment
2.1 Choose a Web Browser
2.2 Install Visual Studio Code
2.3 Install Visual Studio
2.4 Install DB Browser for SQLite
2.5 Miscellaneous/Optional
2.5.1 Show File Name Extensions
2.6 Microsoft SQL Server
2.6.1 Sample Data Generators
3 Brief Introduction to Html
3.1 Let’s Create Our First HTML Page
3.2 Add Titles, Paragraphs and Headings
3.3 Add a Second Webpage
3.4 Add Links and White Spaces to Our Pages
3.5 Add Images and White Spaces to Our Pages
3.6 Tables and Buttons
3.7 A Few Other HTML Elements We’ll Use Later
3.7.1 Label and Select Elements
3.7.2 Input Elements
3.8 Form and More on Input Elements and Attributes
3.9 GET Versus POST Request, the Action and the Method Attributes
4 Brief Introduction to CSS, Javascript, and Bootstrap
4.1 Motivation for Using CSS and JavaScript
4.2 Our First CSS Example
4.3 Introduction to CSS Syntax
4.4 CSS Selectors
4.5 Conflicting CSS Specifications
4.6 Other CSS Selectors
4.7 A Few More Examples of Property-Value Pairs for CSS
4.7.1 Text Color in CSS
4.7.2 Text Alignment in CSS
4.7.3 Fonts in CSS
4.8 The Box Model and the Developer Tools
4.9 The DIV Element
4.10 Ways to Add CSS
4.10.1 Internal
4.10.2 In-line
4.10.3 External
4.11 First Encounter with Bootstrap
4.11.1 Add Bootstrap 5 .css to Our Webpages
4.11.2 Bootstrap 5 Tables
4.11.3 Bootstrap 5 Buttons and Links
4.11.4 Bootstrap 5 Container, Padding
4.11.5 Bootstrap 5 Source Code
4.11.6 Center Contents with
and CSS
4.12 Introduction to JavaScript
4.13 JavaScript Statements
4.14 JavaScript Functions
4.15 Add JavaScript to Our Webpages
4.16 Introduction to the Document Object Model (DOM)
4.17 Add Event Handlers
4.18 An Example: Toggle Between Dark/Light Mode
4.19 The Back Button
4.20 External JavaScript
4.21 More Introduction to Bootstrap
4.22 Ways to Include Bootstrap in Our Projects
4.23 Some CDNs for Bootstrap 5
4.24 View Bootstrap 5 Source Files
4.25 Bootstrap 5 navbar
5 Some C# Fundamentals
5.1 Hello World in C# (Console Application)
5.2 Top-Level Statements
5.3 Namespaces, Using Directive, and Global Using Directive
5.3.1 Namespaces
5.3.2 Using Directives
5.3.3 Implicit Using Directives
5.3.4 Global Using Directives
5.4 Comments
5.5 Existing Data Types
5.6 String Interpolation
5.7 Enumerations
5.8 Classes
5.9 References and Objects
5.10 Instance Variables/Non-static Fields
5.11 Dot Notation
5.12 Methods
5.13 The this Keyword
5.14 Access Modifiers
5.15 Properties
5.16 Constructors
5.17 Method Overloading
5.18 Conditionals, Loops, and Lists
5.19 Collections and Generic Collections
5.20 Inheritance
5.21 The base Keyword and the Constructors
5.22 Interfaces
5.22.1 Some Motivation
5.22.2 How to Define an Interface
5.22.3 How to Implement an Interface
5.23 How to Use an Interface
5.24 Lambda Expressions
5.25 LINQ
5.26 Working with null Values
5.27 Solution Files .sln
5.28 Other Resources for Learning C#
6 Middleware, Services, Intro to Dependency Injection
6.1 What Are ASP .Net (Core) MVC Web Applications?
6.2 An Introduction to the MVC Pattern
6.3 A Quick Dive into an MVC Example (Optional)
6.4 Let’s Start Our ASP .Net Core Application Project in Here
6.4.1 The Empty Web Application Starting Point
6.4.2 The MVC Web Application Starting Point
6.5 Entry Point to Our Web Application: Program.cs
6.6 The Middleware Pipeline
6.6.1 The Current Code in Our Project
6.6.2 Run, Use, and Map
6.6.3 First Example
6.6.4 Second Example
6.6.5 Third Example
6.6.6 Other Middleware Components
6.7 Static Files Middleware
6.7.1 What Are Static Files?
6.7.2 Where Do We Store Static Files?
6.7.3 How Do We Allow Access to Static Files?
6.7.4 How Can We Access Static Files?
6.7.5 Default (Static) Page
6.8 Introduction to Services (Optional)
6.8.1 Example—Step 1: Define a Class and An Interface
6.8.2 Example—Step 2: Register a Service
6.8.3 Example—Step 3: Use a Service
7 Routing, Models, and Controllers
7.1 A Little Cleanup Before We Continue
7.2 Some Essential MVC Concepts and the HTTP Request Lifecycle
7.3 Introduction to Routing
7.3.1 Adding MVC to Our ASP .Net Core Application
7.3.2 Default Routing, the Home Controller, and Actions
7.4 Add a Model, a Controller, and Views
7.4.1 Add a Model Class
7.4.2 Add a (Second) Controller Class
7.4.3 Add a First View
7.4.4 Test Our Code so Far
7.5 Various Action Result Types
7.6 Conventional Versus Attribute Routing
7.6.1 Conventional Routing
7.6.2 Attribute Routing
7.6.3 Mixing Routings
8 More on Controllers and Views, Introduction to Razor Syntax
8.1 A Little Cleanup Before We Continue
8.2 Some Essential MVC Concepts and the HTTP Request Lifecycle (Revisited)
8.3 Another Example of Model, Controller, and Views
8.3.1 The Instructor Model
8.3.2 The InstructorController Class
8.4 The Index Action and View
8.4.1 Add a View for Our Index Action
8.4.2 Strongly Typed and Weakly Typed Views
8.4.3 Introduction to Razor Engine and Razor Syntax
8.4.4 Action Using a View with a Different Name
8.5 The ShowDetails Action and View
8.5.1 The ShowDetails Action
8.5.2 The ShowDetails View
8.6 A First Look at Tag Helpers and HTML Helpers
8.6.1 A First Example of an HTML Helper
8.6.2 A First Example of a Tag Helper
8.6.3 Add Links to the Index View Using Tag Helpers and HTML Helpers
8.6.4 Add Bootstrap to the Index View
8.6.5 Add Links to the ShowDetails View
9 More on Views, Data Annotations
9.1 Introduction to Data Annotations
9.1.1 Update the ShowDetails View
9.1.2 Update the Index View (Optional)
9.2 The Add Action and View
9.2.1 The Add Action—GET
9.2.2 The Add View
9.2.3 The Add Action—POST
9.2.4 A Few More Details About the Model Binding
9.2.5 A Few More Details About the GET Versus POST
9.3 The Edit Action and View
9.3.1 The Edit Action—GET
9.3.2 Add Edit Links in the Index View
9.3.3 The Edit View
9.3.4 The Edit Action—POST
9.3.5 An Example of a Service
9.4 The Delete Action and View
9.4.1 The Delete Action—GET
9.4.2 Add Delete Links in the Index View
9.4.3 The Delete View
9.4.4 The DeleteConfirmed Action—POST
10 Model Validation
10.1 Step 1: Add (Built-in or Custom) Validation Attributes
10.2 Step 2: Enforce Validation by Making Use of the ModelState
10.3 Step 3: Display Error Messages via Validation Tag Helpers
10.3.1 To Display a Summary of All Error Messages
10.3.2 To Display In-line Error Messages
10.4 Let’s Test Our Model Validation
10.5 Custom Validation Attributes (Optional)
10.5.1 Create a Custom Validation Attribute
10.5.2 Use a Custom Validation Attribute
10.5.3 Let’s Test the Newly Added Custom Validation
10.6 Validation Text Styling
11 Persistent Data: Entity Framework Core
11.1 Introduction
11.2 Classes Involved: Providers, DbContext, and DbSet
11.3 Add Entity Framework Core to Our Web Application
11.3.1 Step 1: Create/Choose Your Entity Classes
11.3.2 Step 2: Install NuGet Packages
11.3.3 Step 3: Create a Class Derived from DbContext
11.3.4 Step 4: Data Seeding
11.3.5 Step 5: Register Our DbContext as a Service, and Use a Connection String
11.3.6 Test Our Database
11.4 Use Entity Framework Core in Our Web Application, Dependency Injection Revisited
11.4.1 Inject Entity Framework Core in InstructorController
11.4.2 Update the Actions to Use Entity Framework Core
11.4.3 Important: Automated Id Generation
11.4.4 Let’s Test That We Have Persistent Data
11.4.5 EnsureDeleted
11.5 Practice: Update the StudentController Class
11.5.1 Inject Entity Framework in StudentController
11.5.2 Use Entity Framework Core in StudentController Actions
11.6 How to Use Microsoft SQL Server Instead of SQLite (Optional)
11.6.1 Install SQL Server Express LocalDB Database on Your Machines
11.6.2 Make Changes so Entity Framework Core Now Works with a Microsoft SQL Server Database
12 Consistent Look: Layouts, Friendly Error Pages, and Environments
12.1 Filter Results
12.1.1 Update the Index View
12.1.2 Update the Index Action
12.1.3 Implement the Clear the Filter Button
12.2 Filter Results Using a Dropdown List (Optional)
12.2.1 Create the Dropdown List Items in the Index Action
12.2.2 Display the Dropdown List Items in the Index View
12.2.3 Use of the Dropdown List to Filter Our Results
12.2.4 The Code
12.3 Consistent Webpages—Using Razor Layouts
12.3.1 Create a Layout
12.3.2 Use the Layout in Our Views
12.3.3 Add a Bootstrap 5 Navbar to Our Layout
12.3.4 Add Navigation Links to Various Actions and Controllers
12.4 Layout Sections (Optional)
12.4.1 Define a Section
12.4.2 Make Use of a Section
12.5 Make Use of Bootstrap 5 Buttons
12.5.1 The Index View
12.5.2 The ShowDetails View
12.5.3 Use Bootstrap for Styling Validation Errors
12.6 Configure a Friendly Error Page
12.6.1 Introduction
12.6.2 Work with Multiple Environments
12.6.3 The Developer Exception Page
12.6.4 The Friendly Error Page
13 Work with Images (Optional)
13.1 Add a New Property for the Image to the Model/Entity Class
13.2 Modify the Add View, so It Allows a User to Upload an Image
13.3 Modify the Add Action so the File Uploaded Gets Saved into the Database
13.4 Modify the ShowDetails Action to Transform the Byte Array Back into an Image
13.5 Modify the ShowDetails View so It Displays the Profile Image
13.6 Bootstrap Card Deck for the Index Action and View (Optional)
14 Introduction to Authentication. User Login, Logout, and Registration
14.1 Introduction to Some Security Concepts
14.2 Introduction to ASP .Net (Core) Identity
14.2.1 Step 1: Install NuGet Packages
14.2.2 Step 2: Define Our User Class (Derived from IdentityUser)
14.2.3 Step 3: Update Our DbContext Derived Class to Use Identity
14.2.4 Step 4: Register the Identity Services
14.2.5 Step 5: Add Authentification and Authorization Middleware Components
14.2.6 Test Your Work
14.2.7 Step 6: Register, Login, and Logout
14.2.8 Step 7: Add Simple Authorization to Our Web Application (Optional)
References