আজকের লেকচারে স্বাগতম!

কোথায় আছি আমরা? আপনি বর্তমানে Section 25: Identity-তে আছেন। গত লেকচারে আমরা ইউজারদের জন্য ‘User’ এবং ‘Admin’ Role তৈরি করা শিখেছি। আজকে আমরা শিখবো Areas সম্পর্কে। Areas ব্যবহার করে কীভাবে একটি প্রজেক্টের বিভিন্ন মডিউল বা ইউজার টাইপের (যেমন Admin) জন্য আলাদা আলাদা Controllers, Views এবং Models তৈরি ও ম্যানেজ করতে হয়, তা আজ আমরা জানবো। চলুন শুরু করি!


📝 Quick Summary for Revision

ভবিষ্যতে দ্রুত রিভিশন দেওয়ার জন্য পুরো লেকচারের মূল বিষয়গুলো নিচে লিস্ট করা হলো:

  • Areas Concept: বড় প্রজেক্টকে লজিক্যাল মডিউলে ভাগ করার জন্য Areas ব্যবহার করা হয় (যেমন: Admin Area, Customer Area)।
  • Folder Structure: Area তৈরি করলে প্রজেক্টের রুটে Areas নামে একটি ফোল্ডার তৈরি হয় এবং তার ভেতরে নির্দিষ্ট Area-এর নামে (যেমন: Admin) আরেকটি ফোল্ডার থাকে, যার নিজস্ব Controllers, Models, এবং Views থাকে।
  • [Area] Attribute: Area-এর ভেতরের প্রতিটি Controller-এ [Area("AreaName")] অ্যাট্রিবিউট ব্যবহার করতে হয়।
  • Routing for Areas: Program.cs ফাইলে MapControllerRoute ব্যবহার করে {area:exists}/{controller=Home}/{action=Index}/{id?} প্যাটার্ন কনফিগার করতে হয়।
  • Tag Helpers in Areas: Area-এর Views ফোল্ডারে ডিফল্টভাবে Tag Helpers কাজ করে না। এর জন্য আলাদাভাবে _ViewImports.cshtml তৈরি করতে হয়।
  • Navigation: Area থেকে Root-এ যাওয়ার জন্য asp-area="" এবং Root থেকে Area-তে যাওয়ার জন্য asp-area="Admin" ব্যবহার করতে হয়।
  • Role Check: View-তে User.IsInRole("Admin") ব্যবহার করে কন্ডিশনাল UI (যেমন: Admin Home লিংক) দেখানো যায়।

🧠 Comprehensive Breakdown

এখানে লেকচারের প্রতিটি বিষয় বিস্তারিতভাবে এবং ধাপে ধাপে ব্যাখ্যা করা হলো:

১. What is an Area? (Priority: 10/10)

ধরে নিন, আপনার একটি ই-কমার্স সাইট আছে। সেখানে সাধারণ ইউজারদের জন্য প্রোডাক্ট লিস্ট, কার্ট এবং চেকআউট পেজ আছে। আবার অ্যাডমিনদের জন্য প্রোডাক্ট অ্যাড করা, ডিলিট করা, অর্ডার ম্যানেজ করার মতো সম্পূর্ণ আলাদা একটি ড্যাশবোর্ড আছে।

যদি আপনি এই সবগুলোর Controller এবং View একই ফোল্ডারে রাখেন, তবে প্রজেক্টটি খুব বড় এবং মেইনটেইন করা কঠিন হয়ে যাবে। এই সমস্যার সমাধান হলো Areas। এটি পুরো প্রজেক্টের ভেতরেই আলাদা একটি মিনি-প্রজেক্টের মতো কাজ করে।

২. Creating an Admin Area (Priority: 10/10)

  1. আপনার UI প্রজেক্টের ওপর রাইট-ক্লিক করুন -> Add -> New Scaffolded Item…
  2. বাম পাশ থেকে MVC সিলেক্ট করুন এবং ডান পাশ থেকে MVC Area সিলেক্ট করে Add-এ ক্লিক করুন।
  3. Area Name হিসেবে Admin দিন। এটি Areas/Admin নামে একটি ফোল্ডার স্ট্রাকচার তৈরি করবে। সেখানে অপ্রয়োজনীয় Data ফোল্ডার থাকলে তা ডিলিট করে দিন।

৩. Creating Controller in the Area (Priority: 10/10)

Areas/Admin/Controllers ফোল্ডারে একটি নতুন HomeController তৈরি করুন।

💻 Code Implementation:

using Microsoft.AspNetCore.Mvc;
 
namespace ContactManager.UI.Areas.Admin.Controllers
{
    // এই অ্যাট্রিবিউটটি বলে দেয় যে এই কন্ট্রোলারটি "Admin" এরিয়ার অংশ
    [Area("Admin")] 
    public class HomeController : Controller
    {
        public IActionResult Index()
        {
            return View();
        }
    }
}
 

৪. Configuring Conventional Routing for Areas (Priority: 10/10)

ASP.NET Core যেন বুঝতে পারে যে আমাদের প্রজেক্টে Area আছে এবং তার জন্য আলাদা URL দরকার, তাই Program.cs আপডেট করতে হবে।

💻 Code Implementation (Program.cs in .NET 10):

app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
 
// Area-র জন্য Routing: এটি সবসময় সাধারণ রাউটিং-এর ওপরে থাকতে হবে
app.MapControllerRoute(
    name: "areas",
    pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}"); // {area:exists} নিশ্চিত করে যে URL এ area-এর নাম থাকতেই হবে
 
// সাধারণ (Root) Routing
app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Persons}/{action=Index}/{id?}");
 

৫. Redirecting Based on User Role (Priority: 9/10)

লগইন করার পর ইউজার যদি অ্যাডমিন হয়, তবে তাকে Admin Area-তে পাঠাতে হবে। AccountController এর Login মেথডটি আপডেট করুন।

💻 Code Implementation (AccountController.cs):

if (result.Succeeded)
{
    // ১. ডাটাবেস থেকে ইউজারকে খুঁজে বের করা
    var user = await _userManager.FindByEmailAsync(loginDTO.Email);
 
    // ২. চেক করা হচ্ছে ইউজার "Admin" রোলে আছে কিনা
    if (user != null && await _userManager.IsInRoleAsync(user, "Admin"))
    {
        // ৩. অ্যাডমিন হলে Admin Area-এর Home/Index-এ রিডাইরেক্ট করবে
        return RedirectToAction("Index", "Home", new { area = "Admin" });
    }
 
    // ৪. সাধারণ ইউজার হলে Root-এর Persons/Index-এ রিডাইরেক্ট করবে
    return RedirectToAction(nameof(Index), "Persons");
}
 

৬. Linking Between Area and Root Views (Priority: 8/10)

Root থেকে Area-তে এবং Area থেকে Root-এ যাওয়ার জন্য asp-area ট্যাগ হেল্পারটি খুব গুরুত্বপূর্ণ।

  • Root থেকে Admin Area-তে যাওয়ার লিংক:
<a asp-area="Admin" asp-controller="Home" asp-action="Index">Admin Home</a>
 
  • Admin Area থেকে Root-এ ফেরত আসার লিংক: ```html Back to Site
*(নোট: Area থেকে বের হওয়ার জন্য `asp-area=""` খালি স্ট্রিং দিতে হয়, তা না হলে ফ্রেমওয়ার্ক ধরে নিবে আপনি ওই Area-তেই খুঁজছেন।)*


৭. Fixing View Features in Area (Priority: 7/10)

Area-এর ভেতরের Views ফোল্ডারটি সম্পূর্ণ আলাদা একটি আইল্যান্ড (Island) এর মতো কাজ করে। তাই Root-এর _ViewImports.cshtml এখানে কাজ করবে না। আপনাকে Areas/Admin/Views ফোল্ডারে নতুন করে _ViewImports.cshtml তৈরি করতে হবে এবং ট্যাগ হেল্পার ইম্পোর্ট করতে হবে:

@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
 

৮. Conditional UI Based on Role (Priority: 10/10)

_Layout.cshtml-এ “Admin Home” লিংকটি শুধু অ্যাডমিনদেরই দেখানো উচিত, সাধারণ ইউজারদের নয়।

💻 Code Implementation (Views/Shared/_Layout.cshtml):

@if (User.Identity.IsAuthenticated)
{
    @* User.IsInRole() ব্যবহার করে চেক করা হচ্ছে *@
    @if (User.IsInRole("Admin"))
    {
        <li>
            <a asp-area="Admin" asp-controller="Home" asp-action="Index">Admin Home</a>
        </li>
    }
    }
 

🌟 Best Practices for Areas

  • Avoid Overusing Areas: আপনার প্রজেক্টে যদি ২-৩টি ছোট ছোট মডিউল থাকে, তবে Area তৈরি করার দরকার নেই, সাব-ফোল্ডার করেই ম্যানেজ করা যায়। Area শুধুমাত্র বড় এবং সম্পূর্ণ আইসোলেটেড (Isolated) মডিউলের জন্য ব্যবহার করা উচিত।
  • Reusing Layout: Area-এর জন্য আলাদা Layout তৈরি করা বেস্ট প্র্যাকটিস। যদি Root Layout ব্যবহার করতে চান, তবে Area-এর _ViewStart.cshtml-এ Layout = "~/Views/Shared/_Layout.cshtml"; লিখে দিতে হবে (পুরো পাথ)।

দারুণ! আমরা সফলভাবে Admin Dashboard এর বেইজ তৈরি করে ফেলেছি। পরবর্তী লেকচারে আমরা Role-Based Authentication নিয়ে কাজ করবো, যেখানে আমরা নিশ্চিত করবো যেন সাধারণ ইউজার কোনোভাবেই URL টাইপ করে Admin Area-তে ঢুকতে না পারে!