আপনার দেওয়া লেকচার ট্রান্সক্রিপ্টটি ASP.NET Core-এর Attribute Routing, Route Parameters, এবং Route Constraints (Regular Expression) সম্পর্কিত অত্যন্ত গুরুত্বপূর্ণ এবং অ্যাডভান্সড কিছু কনসেপ্ট কভার করেছে।

চলুন, একজন ট্রেইনার হিসেবে আমি পুরো লেকচারটি ধাপে ধাপে, পরিষ্কারভাবে এবং প্র্যাকটিক্যাল কোডসহ আপনার কাছে ব্যাখ্যা করছি।

📋 লেকচার আউটলাইন এবং প্রায়োরিটি (Lecture Outline & Priorities)

নিচে লেকচারের মূল টপিকগুলোর একটি আউটলাইন এবং সেগুলোর গুরুত্ব (Importance Level) দেওয়া হলো:

  1. Handling Default Route (Empty URL) [Priority: 10/10]

    • কেন গুরুত্বপূর্ণ: প্রজেক্ট রান করার পর প্রথম যে পেইজটি আসে (যেমন localhost:5000/), সেটি ম্যাপ করতে না পারলে ইউজার 404 Error পাবে।
  2. Multiple Routes for a Single Action Method [Priority: 7/10]

    • কেন গুরুত্বপূর্ণ: অনেক সময় একই কন্টেন্ট একাধিক URL দিয়ে অ্যাক্সেস করার প্রয়োজন হতে পারে (যেমন /home এবং / উভয়েই হোমপেজে নিয়ে যাবে)।
  3. Naming Convention (Index Method) [Priority: 8/10]

    • কেন গুরুত্বপূর্ণ: একটি Controller-এর মেইন বা ডিফল্ট মেথডের নাম Index রাখা ইন্ডাস্ট্রির একটি সাধারণ স্ট্যান্ডার্ড।
  4. Decoupling URL from Action Method Name [Priority: 9/10]

    • কেন গুরুত্বপূর্ণ: মেথডের নাম এবং URL সম্পূর্ণ স্বাধীন হওয়া উচিত, যাতে কোড রিফ্যাক্টর করলেও ইউজারের এন্ডে URL অপরিবর্তিত থাকে।
  5. Route Parameters [Priority: 10/10]

    • কেন গুরুত্বপূর্ণ: ডায়নামিক ডেটা (যেমন ইউজারের আইডি বা মোবাইল নম্বর) URL-এর মাধ্যমে পাস করার জন্য এটি অপরিহার্য।
  6. Regex Route Constraints & Escaping Characters [Priority: 9/10]

    • কেন গুরুত্বপূর্ণ: URL-এ ভুল ডেটা (যেমন নম্বরের জায়গায় টেক্সট) আসা ঠেকাতে এবং সিকিউরিটি বাড়াতে রাউটিং লেভেলেই ভ্যালিডেশন করা অত্যন্ত জরুরি।

🚀 বিস্তারিত ব্যাখ্যা (Comprehensive Breakdown)

এবার লেকচারের প্রতিটি বিষয় আমরা কোড এবং “Why” (কেন ব্যবহার করব) সহ বিস্তারিত জানব।

১. Default Route এবং 404 Error সমাধান

সমস্যা: যখন আপনি অ্যাপ্লিকেশন রান করেন, ডিফল্টভাবে ব্রাউজার রুট URL-এ (যেমন localhost:5000/) হিট করে। যদি এই রুট URL-এর জন্য কোনো Action Method ডিফাইন করা না থাকে, তবে 404 Not Found এরর আসে।

সমাধান: একটি Action Method-এর ওপর [Route("/")] অথবা [Route("")] অথবা [Route("~/")] ব্যবহার করতে হবে।

Why (কেন): ইউজার যেন ডোমেইন নেম টাইপ করলেই সরাসরি হোমপেজ দেখতে পায়।

২. Multiple Routes (একাধিক রাউট)

একটি Action Method-এর জন্য আপনি চাইলে একাধিক URL ডিফাইন করতে পারেন।

public class HomeController : Controller
{
    [Route("")]       // Default URL (localhost:port/)
    [Route("/")]      // Default URL alternative
    [Route("home")]   // localhost:port/home
    [Route("sayhello")] // localhost:port/sayhello
    public string Index()
    {
        return "Welcome to the Home Page!";
    }
}

Why: অনেক সময় পুরনো URL থেকে নতুন URL-এ মাইগ্রেট করার সময় ব্যাকওয়ার্ড কম্প্যাটিবিলিটি (Backward compatibility) ধরে রাখার জন্য এটি কাজে লাগে।

৩. Naming Convention: Index Method

লেকচারে বলা হয়েছে রিয়েল-ওয়ার্ল্ড প্রজেক্টে প্রথম Action Method-টির নাম সাধারণত Index রাখা হয়।

Why: এটি কোনো হার্ড রুল নয়, তবে ASP.NET MVC এর জন্মলগ্ন থেকে এটি একটি কনভেনশন। Index মানে হলো কোনো ডিরেক্টরি বা কন্ট্রোলারের মূল এন্ট্রি পয়েন্ট।

৪. URL এবং Action Method Name-এর স্বাধীনতা (Decoupling)

Action Method-এর নাম এবং URL-এর নাম একই হওয়ার কোনো বাধ্যবাধকতা নেই।

  • যেমন: আপনার মেথডের নাম হতে পারে Contact(), কিন্তু আপনি চান ইউজার URL-এ দেখুক contact-us
[Route("contact-us")] // URL হবে: /contact-us
public string Contact() // Method-এর নাম Contact
{
    return "This is the contact page.";
}

Why: এটি SEO (Search Engine Optimization) এর জন্য ভালো এবং URL-কে ইউজার-ফ্রেন্ডলি করে। কোডের ভেতরের নাম ইউজারের জানার প্রয়োজন নেই।

৫. Route Parameters (ডায়নামিক ডেটা পাস করা)

URL-এর মাধ্যমে যদি কোনো ভ্যালু বা ডেটা মেথডে রিসিভ করতে চান, তবে {} (Curly braces) ব্যবহার করতে হয়।

যেমন: contact-us/01711223344

[Route("contact-us/{mobile}")] 
public string Contact(string mobile) 
{
    return $"You have entered mobile number: {mobile}";
}

৬. Regex Route Constraints (রাউট ভ্যালিডেশন)

এটি লেকচারের সবচেয়ে ট্রিকি এবং অ্যাডভান্সড পার্ট। ধরুন, আপনি চান ইউজার মোবাইল নম্বর হিসেবে শুধুমাত্র ১০ ডিজিটের সংখ্যা দিক। অন্য কোনো অক্ষর বা কম/বেশি ডিজিট দিলে যেন এই মেথডটি রান না করে। এর জন্য আমরা Regular Expression (Regex) ব্যবহার করব।

  • Regex Pattern: ^\d{10}$ (শুরু থেকে শেষ পর্যন্ত ঠিক ১০টি ডিজিট)।

  • ASP.NET Core Escaping Problem:

    1. C#-এ \ (Backslash) একটি Escape ক্যারেক্টার। তাই \d লিখতে হলে ডাবল ব্যাকস্ল্যাশ \\d দিতে হবে।

    2. Route Template-এ {} ব্যবহৃত হয় Parameter বোঝাতে। তাই Regex-এর ভেতরের {10} লিখতে হলে ডাবল কার্লি ব্রেসেস {{10}} দিতে হবে।

ফাইনাল কোড:

// :regex() এর ভেতর প্যাটার্ন লিখতে হয়
[Route("contact-us/{mobile:regex(^\\d{{10}}$)}")]
public string Contact(string mobile)
{
    return $"Valid 10-digit mobile number received: {mobile}";
}

Why: Route লেভেলে কনস্ট্রেইন্ট ব্যবহার করলে ভুল ডেটা Action Method পর্যন্ত পৌঁছাতেই পারে না। এটি আগে থেকেই 404 রিটার্ন করে দেয়, যা অ্যাপ্লিকেশনের পারফরম্যান্স এবং সিকিউরিটি বাড়ায়।

⭐ Best Practices এবং Version Context (আধুনিক গাইডলাইন)

লেকচারে ট্রেইনার নিজেই একবার মেনশন করেছেন যে string রিটার্ন করা রেকমেন্ডেড নয়। আধুনিক ASP.NET Core (যেমন .NET 6, 7, 8) অনুযায়ী কিছু Best Practices নিচে দেওয়া হলো:

১. String-এর পরিবর্তে IActionResult রিটার্ন করা:

কখনোই সরাসরি string রিটার্ন করবেন না। কারণ একটি ওয়েব রিকোয়েস্টের সাথে HTTP Status Code (যেমন 200 OK, 400 Bad Request, 404 Not Found) পাঠানো খুবই জরুরি। IActionResult আপনাকে এটি সহজে করতে দেয়।

Old Way (ট্রান্সক্রিপ্টে ব্যবহৃত):

public string Index() {
    return "Hello World";
}

Modern Best Practice:

public IActionResult Index() {
    // 200 OK স্ট্যাটাস কোডের সাথে রেসপন্স পাঠাবে
    return Ok("Hello World"); 
}

২. Route Attributes-এ HTTP Verbs ব্যবহার করা:

শুধু [Route] ব্যবহার করার চেয়ে মেথডের ধরন অনুযায়ী [HttpGet], [HttpPost], [HttpPut] ইত্যাদি ব্যবহার করা API ডিজাইনের জন্য স্ট্যান্ডার্ড। এটি Route Template-ও রিসিভ করতে পারে।

Modern Best Practice:

[ApiController] // API কন্ট্রোলারের জন্য
[Route("api/[controller]")] // ডায়নামিক রাউটিং (ক্লাসের নামের উপর ভিত্তি করে)
public class HomeController : ControllerBase
{
    // এটি শুধু GET রিকোয়েস্টে কাজ করবে এবং URL হবে /api/home/contact-us/{mobile}
    [HttpGet("contact-us/{mobile:regex(^\\d{{10}}$)}")]
    public IActionResult Contact(string mobile)
    {
        return Ok($"Valid mobile: {mobile}");
    }
}

৩. Minimal APIs (.NET 6 এবং তার পরবর্তী ভার্সন):

বর্তমানে খুব ছোট বা মাইক্রোসার্ভিস অ্যাপ্লিকেশনের জন্য Controller তৈরি না করে সরাসরি Program.cs ফাইলে রাউটিং করা যায়, যাকে Minimal APIs বলে। যদিও Controller-এর ব্যবহার এখনো সবচেয়ে বেশি, তবে Minimal API-ও জেনে রাখা ভালো।

Minimal API Example:

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
 
// Controller ছাড়াই সরাসরি রাউটিং এবং Regex Constraint
app.MapGet("/contact-us/{mobile:regex(^\\d{{10}}$)}", (string mobile) => 
{
    return Results.Ok($"Valid mobile: {mobile}");
});
 
app.Run();

আশা করি এই ব্রেকডাউনটি পুরো লেকচারটি বুঝতে আপনার জন্য অনেক সহায়ক হবে। কোনো কনসেপ্ট নিয়ে কনফিউশন থাকলে নির্দ্বিধায় প্রশ্ন করতে পারেন!