4. Routing & Controllers

ASP.NET Core Routing & Controllers - Complete Guide

Practical Guide + Technical Reference


📋 Table of Contents

Part 1: Practical Guide (Hands-On)

  1. What is Routing

  2. Routing System Overview

  3. Creating Routes (3 Methods)

  4. Controllers Deep Dive

  5. Action Results & Return Types

  6. Model Binding & Parameters

  7. Common Routing Patterns

  8. Troubleshooting Common Issues

  9. Best Practices

Part 2: Technical Reference (Deep Dive)

  1. Important Interfaces & Classes Reference

  2. Configuration Deep-Dive

  3. Advanced Routing Topics

  4. Performance Tips


PART 1: PRACTICAL GUIDE


1. What is Routing?

Simple Definition: The process of matching incoming HTTP requests to endpoints (controllers/handlers).

Think of it like: A postal service routing letters to addresses. The URL is the address, routing finds the right mailbox (endpoint).

Key Concepts:

  • Route Template: Pattern like /api/users/{id}

  • Route Parameters: Values extracted from URL ({id})

  • Endpoint: The code that handles the request


2. Routing System Overview

Endpoint Routing (ASP.NET Core 3.0+) ⭐ Current Standard

Two-Phase System:

Phase 1: Routing - Match URL to endpoint

Phase 2: Execution - Run the matched endpoint

Visual Flow

Why Two Phases?

  • Middleware can see which endpoint will run

  • Authentication/authorization know what's being accessed

  • Better performance and flexibility


3. Creating Routes (3 Methods)

Method 1: Minimal APIs (Quick & Modern) ✨ .NET 6+

When to use:

  • ✅ Simple APIs (microservices)

  • ✅ Prototyping

  • ✅ Small projects

  • ❌ Large applications (use controllers)

Step 1: Basic Routes

Step 2: Complete CRUD API

Step 3: Route Groups ✨ .NET 7+


When to use:

  • ✅ Production applications

  • ✅ Large projects

  • ✅ Clear route organization

  • ✅ Team development

Step 1: Create Controller

Step 2: Register Controllers in Program.cs

Step 3: Complete CRUD Controller


Method 3: Convention Routing (Legacy MVC)

When to use:

  • ⚠️ MVC applications with views

  • ⚠️ Legacy applications

  • ❌ New APIs (use attribute routing)

Setup:

Example Routes:


Comparison: Which Method?

Feature
Minimal APIs
Attribute Routing
Convention Routing

Complexity

Simple

Medium

Medium

Best For

Small APIs, Prototypes

Production APIs

MVC with Views

Scalability

Low

High

Medium

Discoverability

Low

High

Medium

Type Safety

Medium

High

High

Performance

Fastest

Fast

Fast

.NET Version

6.0+

2.0+

1.0+

Decision Tree:


4. Controllers Deep Dive

ControllerBase vs Controller

Class
Inherit From
Use For
Has View Support

ControllerBase

-

APIs (JSON)

No

Controller

ControllerBase

MVC (Views)

Yes

ControllerBase (API Controllers) ⭐

Controller (MVC with Views)


Route Attributes

[Route] Attribute - Define route template

Token Replacement:

HTTP Method Attributes:

Attribute
HTTP Method
Common Use

[HttpGet]

GET

Read data

[HttpPost]

POST

Create data

[HttpPut]

PUT

Update (full)

[HttpPatch]

PATCH

Update (partial)

[HttpDelete]

DELETE

Delete data

[HttpHead]

HEAD

Headers only

[HttpOptions]

OPTIONS

Supported methods

Combined Routes:


[ApiController] Attribute ✨ ASP.NET Core 2.1+

What it does:

  1. ✅ Automatic model validation

  2. ✅ Infers parameter binding sources

  3. ✅ Returns 400 for invalid models

  4. ✅ Problem details for errors

Without [ApiController]:

With [ApiController]:

Configure Behavior:


5. Action Results & Return Types

IActionResult - Flexible Return Type ⭐

Common Action Results:

Method
Status Code
Use Case

Ok(value)

200

Success with data

Created(uri, value)

201

Resource created

CreatedAtAction(...)

201

Created (route to resource)

NoContent()

204

Success, no data

BadRequest(error)

400

Invalid request

Unauthorized()

401

Not authenticated

Forbid()

403

Not authorized

NotFound()

404

Resource not found

Conflict(error)

409

Conflict (duplicate)

UnprocessableEntity(error)

422

Validation failed

StatusCode(code)

Custom

Any status code

Examples:


ActionResult - Type-Safe Returns ✨ ASP.NET Core 2.1+

Benefits:

  • ✅ Compile-time type safety

  • ✅ Better documentation

  • ✅ Cleaner code

  • ✅ OpenAPI/Swagger support

Examples:


Comparison: IActionResult vs ActionResult

When to Use:

Return Type
Use When

IActionResult

Multiple different return types

ActionResult<T>

Primary return type with error cases ⭐

T

Always returns data (no errors)


Results Class ✨ .NET 6+

For Minimal APIs:


6. Model Binding & Parameters

Parameter Binding Sources

Automatic Binding (with [ApiController]):

Source
Attribute
Use For

URL route

[FromRoute]

/users/{id}

Query string

[FromQuery]

?page=1&size=10

Request body

[FromBody]

JSON payload

Form data

[FromForm]

Form submissions

Header

[FromHeader]

HTTP headers

Services

[FromServices]

DI services

Examples:


Complex Binding Examples

Binding Lists:

Binding Complex Objects:


Model Validation

Data Annotations:

Using Validation:


7. Common Routing Patterns

RESTful API Design

Resource-Based URLs:


API Versioning

Method 1: URL Versioning (Most Common)

Method 2: Query String Versioning

Method 3: Header Versioning


Route Constraints

Built-in Constraints:

Constraint
Example
Matches

int

{id:int}

1, 123, -5

long

{id:long}

123456789

decimal

{price:decimal}

10.5, 99.99

bool

{active:bool}

true, false

datetime

{date:datetime}

2024-01-15

guid

{id:guid}

32-char GUID

alpha

{name:alpha}

ABC, xyz

min(n)

{age:min(18)}

18, 25, 100

max(n)

{age:max(100)}

1, 50, 100

range(min,max)

{age:range(18,100)}

18-100

length(n)

{code:length(6)}

ABCDEF

minlength(n)

{name:minlength(2)}

AB, ABC

maxlength(n)

{name:maxlength(50)}

Up to 50 chars

regex(expr)

{ssn:regex(^\\d{{3}}-\\d{{2}}-\\d{{4}}$)}

Pattern match

Examples:


Catch-All Routes


Area Routing (Large Applications)


8. Troubleshooting Common Issues

Issue 1: Route Conflicts

Problem:

Solution: Order matters!


Issue 2: Missing MapControllers()

Problem:

Solution:


Issue 3: Wrong HTTP Method

Problem:

Solution:


Issue 4: Model Binding Fails

Problem:

Solution:


9. Best Practices

API Design

  • ✅ Use attribute routing for APIs

  • ✅ Use [ApiController] attribute

  • ✅ Return ActionResult<T> for type safety

  • ✅ Use proper HTTP methods (GET, POST, PUT, DELETE)

  • ✅ Return correct status codes (200, 201, 404, etc.)

  • ✅ Version your APIs (URL versioning recommended)

  • ✅ Use route constraints for validation

Route Templates

  • ✅ Use lowercase URLs: api/users not API/Users

  • ✅ Use plural nouns: users not user

  • ✅ Use hyphens for readability: order-items not orderitems

  • ✅ Keep routes simple and predictable

  • ✅ Order specific routes before generic routes

  • ✅ Use constraints to avoid conflicts

Controllers

  • ✅ One controller per resource (Users, Products, Orders)

  • ✅ Keep controllers thin (use services)

  • ✅ Use async methods for I/O operations

  • ✅ Add XML comments for Swagger/OpenAPI

  • ✅ Use [ProducesResponseType] for documentation

  • ✅ Inject dependencies via constructor


PART 2: TECHNICAL REFERENCE


10. Important Interfaces & Classes Reference

ControllerBase Class ⭐⭐⭐

Purpose: Base class for API controllers (no view support)

Namespace: Microsoft.AspNetCore.Mvc

Key Properties:

Property
Type
Description

Request

HttpRequest

Current HTTP request

Response

HttpResponse

Current HTTP response

User

ClaimsPrincipal

Current authenticated user

ModelState

ModelStateDictionary

Model validation state

HttpContext

HttpContext

Full HTTP context

RouteData

RouteData

Route values

Key Methods (Action Results):

Method
Status
Returns

Ok()

200

OkResult

Ok(value)

200

OkObjectResult

Created(uri, value)

201

CreatedResult

CreatedAtAction(...)

201

CreatedAtActionResult

CreatedAtRoute(...)

201

CreatedAtRouteResult

NoContent()

204

NoContentResult

BadRequest()

400

BadRequestResult

BadRequest(error)

400

BadRequestObjectResult

Unauthorized()

401

UnauthorizedResult

Forbid()

403

ForbidResult

NotFound()

404

NotFoundResult

NotFound(value)

404

NotFoundObjectResult

Conflict()

409

ConflictResult

Conflict(error)

409

ConflictObjectResult

UnprocessableEntity()

422

UnprocessableEntityResult

StatusCode(code)

Custom

StatusCodeResult

Helper Methods:

Method
Purpose

TryValidateModel(model)

Manual validation

Problem(...)

RFC 7807 problem details

File(...)

Return file download

Redirect(url)

Redirect to URL

RedirectToAction(...)

Redirect to action

LocalRedirect(url)

Redirect (local only)

Complete Example:


Controller Class ⭐⭐

Purpose: Base class for MVC controllers (with view support)

Inherits: ControllerBase

Additional Methods:

Method
Purpose

View()

Return view result

View(model)

Return view with model

View(viewName, model)

Return named view

PartialView(...)

Return partial view

Json(data)

Return JSON result

Content(text)

Return text content

Example:


IActionResult Interface ⭐⭐⭐

Purpose: Represents the result of an action method

Implementations:

Class
Status
Usage

OkResult

200

Success, no data

OkObjectResult

200

Success with data

CreatedResult

201

Resource created

CreatedAtActionResult

201

Created with route

CreatedAtRouteResult

201

Created with route name

NoContentResult

204

Success, no content

BadRequestResult

400

Bad request, no data

BadRequestObjectResult

400

Bad request with errors

UnauthorizedResult

401

Not authenticated

ForbidResult

403

Not authorized

NotFoundResult

404

Not found, no data

NotFoundObjectResult

404

Not found with data

ConflictResult

409

Conflict

UnprocessableEntityResult

422

Validation failed

StatusCodeResult

Custom

Any status code

ObjectResult

Custom

Any status + data


RouteData Class ⭐⭐

Purpose: Contains route values from the current request

Key Properties:

Property
Type
Description

Values

RouteValueDictionary

Route parameter values

DataTokens

RouteValueDictionary

Additional route data

Routers

IList

Route handlers

Example:


ModelStateDictionary Class ⭐⭐

Purpose: Contains validation state and errors

Key Methods:

Method
Purpose

IsValid

Check if model is valid

AddModelError(key, message)

Add error

Clear()

Clear all errors

Remove(key)

Remove specific error

Example:


11. Configuration Deep-Dive

Pattern 1: No Configuration (Defaults)

Simple setup:


Pattern 2: Code-Based Configuration

Configure controllers in code:


Pattern 3: Configuration from appsettings.json

appsettings.json:

Program.cs:


12. Advanced Routing Topics

Custom Route Constraints

Create custom constraint:


Route Value Transformers ✨ ASP.NET Core 3.0+

Transform route values:


Generate URLs to actions:


Route Debugging

View matched endpoint:


13. Performance Tips

1. Use Route Constraints

Improves matching performance:


2. Order Routes Efficiently

Most specific routes first:


3. Use ActionResult

Reduces allocations:


4. Async All The Way

Use async for I/O:


Summary: Complete Routing Checklist

Project Setup:

Controller Design:

Actions:

Routing:

Validation:


This completes the Routing & Controllers guide with practical examples and deep technical reference!

Last updated