📝 Quick Revision Summary

  • **Model Binding:** āĻāϟāĻŋ āĻāĻ•āϟāĻŋ āĻ¸ā§āĻŦ⧟āĻ‚āĻ•ā§āϰāĻŋ⧟ āĻĒā§āϰāĻ•ā§āϰāĻŋ⧟āĻž āϝāĻž HTTP Request āĻĨ⧇āϕ⧇ āĻĄāĻžāϟāĻž āϏāĻ‚āĻ—ā§āϰāĻš āĻ•āϰ⧇ āϏāϰāĻžāϏāϰāĻŋ Controller-āĻāϰ Action Method Parameter-āĻ āĻŽā§āϝāĻžāĻĒ āĻ•āϰ⧇āĨ¤
  • **āϕ⧋āĻĄ āĻ…āĻĒāϟāĻŋāĻŽāĻžāχāĻœā§‡āĻļāύ:** Request.Query["key"] āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻŽā§āϝāĻžāύ⧁⧟āĻžāϞāĻŋ āĻĄāĻžāϟāĻž āϰāĻŋāĻĄ āĻ•āϰāĻžāϰ āĻĻā§€āĻ°ā§āϘ āĻāĻŦāĻ‚ Error-prone āĻĒāĻĻā§āϧāϤāĻŋ āĻĻā§‚āϰ āĻ•āϰ⧇ āĻāϟāĻŋ āϕ⧋āĻĄāϕ⧇ āĻ•ā§āϞāĻŋāύ āϰāĻžāϖ⧇āĨ¤
  • **Nullable Types:** āĻĄāĻžāϟāĻž āύāĻž āĻĨāĻžāĻ•āϞ⧇ Error āĻā§œāĻžāϤ⧇ Parameter-āĻāϰ āĻĄā§‡āϟāĻž āϟāĻžāχāĻĒ⧇āϰ āϏāĻžāĻĨ⧇ ? (āϝ⧇āĻŽāύ: int? bookId) āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āĻšā§ŸāĨ¤
  • **Execution Order:** Model Binding āϏāĻŦāϏāĻŽā§Ÿ Action Method āĻāĻ•ā§āϏāĻŋāĻ•āĻŋāωāϟ āĻšāĻ“ā§ŸāĻžāϰ āĻ āĻŋāĻ• āφāϗ⧇ āĻ•āĻžāϜ āĻ•āϰ⧇āĨ¤
  • **Priority Rule:** āĻāĻ•āχ Parameter-āĻāϰ āĻ­ā§āϝāĻžāϞ⧁ āϝāĻĻāĻŋ Route Data (URL path) āĻāĻŦāĻ‚ Query String (?key=value) āωāϭ⧟ āϜāĻžā§ŸāĻ—āĻžā§Ÿ āĻĨāĻžāϕ⧇, āϤāĻŦ⧇ Model Binding āϏāĻŦ āϏāĻŽā§Ÿ Route Data-āϕ⧇ āĻŦ⧇āĻļāĻŋ Priority āĻŦāĻž āĻ…āĻ—ā§āϰāĻžāϧāĻŋāĻ•āĻžāϰ āĻĻā§‡ā§ŸāĨ¤

🔍 Comprehensive Breakdown

āĻāĻ–āĻžāύ⧇ āĻŸā§āϰāĻžāĻ¨ā§āϏāĻ•ā§āϰāĻŋāĻĒā§āĻŸā§‡āϰ āĻĒā§āϰāϤāĻŋāϟāĻŋ āĻŦāĻŋāώ⧟ āϧāĻžāĻĒ⧇ āϧāĻžāĻĒ⧇, āĻ•āĻžāϰāĻŖāϏāĻš (Why) āĻāĻŦāĻ‚ āϕ⧋āĻĄ āχāĻŽāĻĒā§āϞāĻŋāĻŽā§‡āĻ¨ā§āĻŸā§‡āĻļāύāϏāĻš āĻŦā§āϝāĻžāĻ–ā§āϝāĻž āĻ•āϰāĻž āĻšāϞ⧋:

ā§§. Model Binding-āĻāϰ āĻĒā§āĻ°ā§Ÿā§‹āϜāĻ¨ā§€ā§ŸāϤāĻž (Priority: 9/10)

āϕ⧇āύ āĻĒā§āĻ°ā§Ÿā§‹āϜāύ (The Why): āϏāĻžāϧāĻžāϰāĻŖāϤ āĻāĻ•āϟāĻŋ HTTP Get Request āĻĨ⧇āϕ⧇ Query String Parameter-āĻāϰ āĻ­ā§āϝāĻžāϞ⧁ āĻŦ⧇āϰ āĻ•āϰāϤ⧇ āĻšāϞ⧇ āĻĄā§‡āϭ⧇āϞāĻĒāĻžāϰāĻĻ⧇āϰ Request.Query.ContainsKey("bookId") āĻŦāĻž āĻāϰāĻ•āĻŽ āĻĻā§€āĻ°ā§āϘ āϕ⧋āĻĄ āϞāĻŋāĻ–āϤ⧇ āĻšā§ŸāĨ¤ āĻāϟāĻŋ āĻŦāĻžāϰāĻŦāĻžāϰ āϞ⧇āĻ–āĻž āĻŦāĻŋāϰāĻ•ā§āϤāĻŋāĻ•āϰ āĻāĻŦāĻ‚ āĻāϤ⧇ āϭ⧁āϞ āĻšāĻ“ā§ŸāĻžāϰ āϏāĻŽā§āĻ­āĻžāĻŦāύāĻž (Error-prone) āĻĨāĻžāϕ⧇āĨ¤

Model Binding āĻāχ āϏāĻŽāĻ¸ā§āϝāĻžāϰ āϏāĻŽāĻžāϧāĻžāύ āĻ•āϰ⧇āĨ¤ āĻāϟāĻŋ āĻ¸ā§āĻŦ⧟āĻ‚āĻ•ā§āϰāĻŋ⧟āĻ­āĻžāĻŦ⧇ Request āĻĨ⧇āϕ⧇ āĻ­ā§āϝāĻžāϞ⧁ āύāĻŋā§Ÿā§‡ Action Method-āĻāϰ Parameter-āĻ āĻŦāϏāĻŋā§Ÿā§‡ āĻĻā§‡ā§ŸāĨ¤

Code Implementation:

// ❌ Old/Manual Way (Without Model Binding)
public IActionResult GetBook()
{
    if(Request.Query.ContainsKey("bookId"))
    {
        var id = Request.Query["bookId"];
        // do something
    }
    return View();
}
 
// ✅ Smart Way (With Model Binding)
public IActionResult GetBook(int bookId) 
{
    // ASP.NET Core āĻ¸ā§āĻŦ⧟āĻ‚āĻ•ā§āϰāĻŋ⧟āĻ­āĻžāĻŦ⧇ URL āĻĨ⧇āϕ⧇ bookId āĻāϰ āĻ­ā§āϝāĻžāϞ⧁ āĻāĻ–āĻžāύ⧇ āĻĒāĻžāϏ āĻ•āϰāĻŦ⧇āĨ¤
    return Content($"Book ID is: {bookId}");
}
 

⧍. Missing Values āĻāĻŦāĻ‚ Nullable Parameters (Priority: 8/10)

āϕ⧇āύ āĻĒā§āĻ°ā§Ÿā§‹āϜāύ (The Why): URL-āĻ āϝāĻĻāĻŋ āχāωāϜāĻžāϰ āϕ⧋āύ⧋ bookId āύāĻž āĻĻā§‡ā§Ÿ, āϤāĻ–āύ āϏāĻžāϧāĻžāϰāĻŖ int āĻĄā§‡āϟāĻž āϟāĻžāχāĻĒ āĻ•ā§āĻ°ā§āϝāĻžāĻļ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇ āĻŦāĻž āĻĄāĻŋāĻĢāĻ˛ā§āϟ 0 āύāĻŋā§Ÿā§‡ āύāĻŋāϤ⧇ āĻĒāĻžāϰ⧇, āϝāĻž āϞāϜāĻŋāĻ•ā§āϝāĻžāϞ āĻŦāĻžāĻ— āϤ⧈āϰāĻŋ āĻ•āϰ⧇āĨ¤ āϤāĻžāχ Optional āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāϟāĻžāϰ⧇āϰ āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇ Nullable Type (?) āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āĻšā§ŸāĨ¤

Code Implementation:

public IActionResult GetBook(int? bookId)
{
    // āĻ­ā§āϝāĻžāϞ⧁ āĻĻ⧇āĻ“ā§ŸāĻž āĻšā§Ÿā§‡āϛ⧇ āĻ•āĻŋāύāĻž āϤāĻž āĻšā§‡āĻ• āĻ•āϰāĻž
    if (!bookId.HasValue)
    {
        return BadRequest("Book ID is not supplied or empty.");
    }
 
    if (bookId < 0)
    {
        return BadRequest("Book ID cannot be less than zero.");
    }
 
    return Content($"Book ID is: {bookId}");
}
 

ā§Š. Route Data āĻāĻŦāĻ‚ Query String (Priority: 7/10)

  • Route Data: āĻāϟāĻŋ URL-āĻāϰ āĻŽā§‚āϞ Path-āĻāϰ āĻ…āĻ‚āĻļāĨ¤ āϰāĻžāωāϟāĻŋāĻ‚ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ⧇ {} (Curly braces) āĻĻāĻŋā§Ÿā§‡ āĻāϗ⧁āϞ⧋ āĻĄāĻŋāĻĢāĻžāχāύ āĻ•āϰāĻž āĻšā§ŸāĨ¤ āϝ⧇āĻŽāύ: /bookstore/{bookId}āĨ¤
  • Query String: āĻāϟāĻŋ URL-āĻāϰ āĻļ⧇āώ⧇ ? āϚāĻŋāĻšā§āύ⧇āϰ āĻĒāϰ āĻĨāĻžāϕ⧇ āĻāĻŦāĻ‚ Key-Value āĻĒā§‡ā§ŸāĻžāϰ āĻšāĻŋāϏ⧇āĻŦ⧇ āĻ•āĻžāϜ āĻ•āϰ⧇āĨ¤ āϝ⧇āĻŽāύ: /bookstore?bookId=10āĨ¤

ā§Ē. Model Binding Priority Rule: Route Data vs Query String (Priority: 10/10)

āϕ⧇āύ āĻĒā§āĻ°ā§Ÿā§‹āϜāύ (The Why): āĻ•āĻ–āύ⧋ āĻ•āĻ–āύ⧋ āχāωāϜāĻžāϰ āĻāĻ•āχ āύāĻžāĻŽā§‡āϰ Parameter, Route Data āĻāĻŦāĻ‚ Query String āωāϭ⧟ āϜāĻžā§ŸāĻ—āĻžā§Ÿ āĻĒāĻžāĻ āĻŋā§Ÿā§‡ āĻĻāĻŋāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ āĻāχ āĻ•āύāĻĢā§āϞāĻŋāĻ•ā§āϟ āĻŦāĻž āĻĻā§āĻŦāĻ¨ā§āĻĻā§āĻŦ āĻŽā§‡āϟāĻžāύ⧋āϰ āϜāĻ¨ā§āϝ ASP.NET Core-āĻ āĻāĻ•āϟāĻŋ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ Order āĻŦāĻž āĻ•ā§āϰāĻŽāĻžāύ⧁āϏāĻžāϰ⧇ āĻĄāĻžāϟāĻž āϰāĻŋāĻĄ āĻ•āϰāĻž āĻšā§ŸāĨ¤

āĻŸā§āϰāĻžāĻ¨ā§āϏāĻ•ā§āϰāĻŋāĻĒā§āĻŸā§‡ āĻŦāϞāĻž āĻšā§Ÿā§‡āϛ⧇, Model Binding Top to Bottom āĻ…ā§āϝāĻžāĻĒā§āϰ⧋āĻšā§‡ āĻ•āĻžāϜ āĻ•āϰ⧇ āĻāĻŦāĻ‚ Route Data-āĻāϰ Priority, Query String-āĻāϰ āĻšā§‡ā§Ÿā§‡ āĻŦ⧇āĻļāĻŋāĨ¤

Scenario / Code Implementation: āϧāϰāĻž āϝāĻžāĻ• āφāĻŽāĻžāĻĻ⧇āϰ Route āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ āύāĻŋāĻšā§‡āϰ āĻŽāϤ⧋:

[Route("bookstore/{bookId?}/{isLoggedIn?}")]
public IActionResult GetBookInfo(int? bookId, bool? isLoggedIn)
{
    return Content($"Book: {bookId}, Logged In: {isLoggedIn}");
}
 

āĻāĻ–āύ āϝāĻĻāĻŋ āχāωāϜāĻžāϰ āύāĻŋāĻšā§‡āϰ URL-āĻ Request āĻĒāĻžāĻ āĻžā§Ÿ: http://localhost:5202/bookstore/1/false?bookId=10&isLoggedIn=true

āĻāĻ–āĻžāύ⧇:

  • Route Data: bookId = 1, isLoggedIn = false
  • Query String: bookId = 10, isLoggedIn = true

āĻĢāϞāĻžāĻĢāϞ: āϝ⧇āĻšā§‡āϤ⧁ Route Data-āĻāϰ āĻĒā§āϰāĻžā§Ÿā§‹āϰāĻŋāϟāĻŋ āĻŦ⧇āĻļāĻŋ, āϤāĻžāχ Action Method-āĻāϰ Parameter āĻšāĻŋāϏ⧇āĻŦ⧇ 1 āĻāĻŦāĻ‚ false āϰāĻŋāϏāĻŋāĻ­ āĻšāĻŦ⧇āĨ¤ Query String-āĻāϰ 10 āĻāĻŦāĻ‚ true āχāĻ—āύ⧋āϰ āĻ•āϰāĻž āĻšāĻŦ⧇āĨ¤

(āύ⧋āϟ: āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āϕ⧋āύ⧋ āϏ⧋āĻ°ā§āϏ āĻĨ⧇āϕ⧇ āĻĄāĻžāϟāĻž āύāĻŋāϤ⧇ āϚāĻžāχāϞ⧇ [FromQuery] āĻŦāĻž [FromRoute] āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āĻšā§Ÿ, āϝāĻž āĻŸā§āϰāĻžāĻ¨ā§āϏāĻ•ā§āϰāĻŋāĻĒā§āĻŸā§‡ āĻĒāϰāĻŦāĻ°ā§āϤ⧀ āϞ⧇āĻ•āϚāĻžāϰ⧇āϰ āϟāĻĒāĻŋāĻ• āĻšāĻŋāϏ⧇āĻŦ⧇ āωāĻ˛ā§āϞ⧇āĻ– āĻ•āϰāĻž āĻšā§Ÿā§‡āϛ⧇āĨ¤)


💡 Best Practices

  1. Always use Nullable Types for Optional Data: āϝāĻĻāĻŋ āϕ⧋āύ⧋ Parameter āφāĻŦāĻļā§āϝāĻŋāĻ• (Required) āύāĻž āĻšā§Ÿ, āϤāĻŦ⧇ āϏāĻŦāϏāĻŽā§Ÿ int?, bool? āχāĻ¤ā§āϝāĻžāĻĻāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύāĨ¤ āĻāϤ⧇ Null Reference Exception āĻā§œāĻžāύ⧋ āϝāĻžā§ŸāĨ¤
  2. Explicit Attributes āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž: āϕ⧋āĻĄā§‡āϰ āϰāĻŋāĻĄā§‡āĻŦāĻŋāϞāĻŋāϟāĻŋ āĻŦāĻžā§œāĻžāύ⧋āϰ āϜāĻ¨ā§āϝ āĻĄāĻžāϟāĻž āϕ⧋āĻĨāĻž āĻĨ⧇āϕ⧇ āφāϏāĻŦ⧇ āϤāĻž āĻ¸ā§āĻĒāĻˇā§āϟāĻ­āĻžāĻŦ⧇ āĻŦāϞ⧇ āĻĻ⧇āĻ“ā§ŸāĻž āωāϚāĻŋāϤāĨ¤
// Example
public IActionResult ProcessData([FromRoute] int id, [FromQuery] string search)
{ ... }
 
  1. Naming Convention: Route Parameter āĻāĻŦāĻ‚ Action Method Parameter-āĻāϰ āύāĻžāĻŽ āĻšā§āĻŦāĻšā§ āĻāĻ• āϰāĻžāĻ–āĻž āωāϚāĻŋāϤ (āϝāĻĻāĻŋāĻ“ āĻāϟāĻŋ Case-Insensitive, āϤāĻŦ⧁āĻ“ āĻ•ā§āϞāĻŋāύ āϕ⧋āĻĄā§‡āϰ āϜāĻ¨ā§āϝ āĻāĻ•āχ Case āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āĻ­āĻžāϞ⧋)āĨ¤

🚀 .NET 10 Update (Changes from .NET 6)

āĻŸā§āϰāĻžāĻ¨ā§āϏāĻ•ā§āϰāĻŋāĻĒā§āĻŸā§‡āϰ āĻ•āύāϏ⧇āĻĒā§āϟāϗ⧁āϞ⧋ .NET 6 āĻŦāĻž āϤāĻžāϰ āφāϗ⧇āϰ āĻ­āĻžāĻ°ā§āϏāύ⧇āϰ āĻ•āĻ¨ā§āĻŸā§āϰ⧋āϞāĻžāϰ-āĻ­āĻŋāĻ¤ā§āϤāĻŋāĻ• āφāĻ°ā§āĻ•āĻŋāĻŸā§‡āĻ•āϚāĻžāϰ⧇āϰ āωāĻĒāϰ āĻ­āĻŋāĻ¤ā§āϤāĻŋ āĻ•āϰ⧇āĨ¤ .NET 10-āĻ (āĻāĻŦāĻ‚ .NET 8/9 āĻāϰ āϧāĻžāϰāĻžāĻŦāĻžāĻšāĻŋāĻ•āϤāĻžā§Ÿ) Minimal APIs-āĻ Model Binding-āϕ⧇ āφāϰāĻ“ āĻ…āύ⧇āĻ• āĻŦ⧇āĻļāĻŋ āĻļāĻ•ā§āϤāĻŋāĻļāĻžāϞ⧀ āĻāĻŦāĻ‚ Implicit āĻ•āϰāĻž āĻšā§Ÿā§‡āϛ⧇āĨ¤

.NET 10-āĻ [AsParameters] āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻ…āύ⧇āĻ•āϗ⧁āϞ⧋ Query āĻŦāĻž Route parameter-āϕ⧇ āϖ⧁āĻŦ āϏāĻšāĻœā§‡āχ āĻāĻ•āϟāĻŋ āĻ…āĻŦāĻœā§‡āĻ•ā§āĻŸā§‡ āĻŦāĻžāχāĻ¨ā§āĻĄ āĻ•āϰāĻž āϝāĻžā§Ÿ, āϝāĻž āĻ•āĻ¨ā§āĻŸā§āϰ⧋āϞāĻžāϰ⧇āϰ āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāϟāĻžāϰ āϞāĻŋāĻ¸ā§āϟāϕ⧇ āϛ⧋āϟ āĻ“ āϏ⧁āĻ¨ā§āĻĻāϰ āϰāĻžāϖ⧇āĨ¤

.NET 10 Code Implementation Example:

// āĻāĻ•āϟāĻŋ āϰ⧇āĻ•āĻ°ā§āĻĄ āϟāĻžāχāĻĒ āϤ⧈āϰāĻŋ āĻ•āϰāĻž āĻšāϞ⧋
public record BookRequest(int? BookId, bool? IsLoggedIn);
 
var app = WebApplication.CreateBuilder(args).Build();
 
// Minimal API with [AsParameters]
app.MapGet("/bookstore/{BookId?}/{IsLoggedIn?}", ([AsParameters] BookRequest request) => 
{
    if (request.BookId is null) return Results.BadRequest("ID missing");
    
    // Route Data āĻāĻŦāĻ‚ Query String āĻĨ⧇āϕ⧇ āĻ¸ā§āĻŦ⧟āĻ‚āĻ•ā§āϰāĻŋ⧟āĻ­āĻžāĻŦ⧇ BookRequest āĻ…āĻŦāĻœā§‡āĻ•ā§āĻŸā§‡ āĻĄāĻžāϟāĻž āĻŽā§āϝāĻžāĻĒ āĻšā§Ÿā§‡ āϝāĻžāĻŦ⧇
    return Results.Ok($"Book: {request.BookId}, LoggedIn: {request.IsLoggedIn}");
});
 
app.Run();
 

.NET 10-āĻ Reflection-āĻāϰ āĻŦāĻĻāϞ⧇ Source Generators āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻžā§Ÿ āĻāχ Model Binding āĻāĻ–āύ āĻ…āύ⧇āĻ• āĻŦ⧇āĻļāĻŋ āĻĢāĻžāĻ¸ā§āϟ āĻāĻŦāĻ‚ āĻŽā§‡āĻŽāϰāĻŋ āĻāĻĢāĻŋāĻļāĻŋā§Ÿā§‡āĻ¨ā§āϟāĨ¤