হাসিব, চলো তোমার কোর্সের ১০০ নম্বর লেকচারটি নিয়ে বিস্তারিত আলোচনা করি। এটি Section 8: Views - MVC Architecture Pattern এর অংশ এবং এর শিরোনাম হলো _ViewImports.cshtml।
আগের লেকচারগুলোতে আমরা দেখেছি যে, যখনই আমরা কোনো Model (যেমন- Person বা Product) View-তে ব্যবহার করি, তখন বারবার @using MyWebApp.Models লিখতে হয়। এই লেকচারে ইনস্ট্রাক্টর দেখিয়েছেন কীভাবে _ViewImports.cshtml ফাইল ব্যবহার করে পুরো প্রজেক্টে এই বারবার Namespace ইমপোর্ট করার ঝামেলা দূর করা যায়।
নিচে পুরো লেকচারটির বিস্তারিত ব্রেকডাউন দেওয়া হলো:
📝 Summary (সারসংক্ষেপ)
-
What is _ViewImports.cshtml? এটি একটি স্পেশাল Razor ফাইল, যার কাজ হলো পুরো প্রজেক্টের বা নির্দিষ্ট ফোল্ডারের সব View ফাইলের জন্য গ্লোবালি Namespace (@using) ইমপোর্ট করা।
-
Purpose: এটি ব্যবহার করলে তোমাকে আর প্রতিটি View ফাইলের উপরে বারবার @using লিখতে হবে না। কোড রিডান্ডেন্সি (Redundancy) কমে এবং কোড ক্লিন থাকে।
-
File Naming Rules: ফাইলের নাম অবশ্যই ঠিক ViewImports.cshtml হতে হবে। এর নামের শুরুতে আন্ডারস্কোর () থাকতে হবে। অন্য কোনো নাম দিলে এটি কাজ করবে না।
-
Global vs Local Execution:
-
Global: যদি Views/ রুট ফোল্ডারে ফাইলটি রাখা হয়, তবে প্রজেক্টের সব View ফাইলের জন্য এটি কাজ করবে।
-
Local: যদি নির্দিষ্ট কোনো ফোল্ডারের (যেমন- Views/Home/) ভেতরে রাখা হয়, তবে সেটি শুধু ওই ফোল্ডারের View ফাইলগুলোর জন্যই কাজ করবে।
-
Combination: একটি View ফাইলে গ্লোবাল এবং লোকাল—উভয় _ViewImports.cshtml ফাইলের কনফিগারেশন একসাথেই অ্যাপ্লাই হয়।
📌 The Problem: Repeating @using Directives [Priority: 8/10]
যখন আমরা Strongly Typed Views তৈরি করি, তখন আমাদের Model ক্লাসের পাথ বা Namespace বলে দিতে হয়। যেমন, Index.cshtml-এ:
@using MyWebApp.Models
@model IEnumerable<Person>
আবার Details.cshtml-এ:
@using MyWebApp.Models
@model Person
দেখো, একই @using MyWebApp.Models লাইনটি আমাদের প্রতিটি View ফাইলে লিখতে হচ্ছে। যদি তোমার প্রোজেক্টে ৫০টি View থাকে, তবে ৫০ বার এই একই লাইন লিখতে হবে। এটি মোটেও ভালো প্র্যাকটিস নয়।
📌 The Solution: _ViewImports.cshtml [Priority: 10/10]
এই সমস্যার সমাধান হলো _ViewImports.cshtml। তুমি যদি এই ফাইলে একবার কোনো Namespace ইমপোর্ট করো, তবে ASP.NET Core কম্পাইলার স্বয়ংক্রিয়ভাবে সেই Namespace-টি বাকি সব View ফাইলের শুরুতে কপি করে দেবে।
🛠️ Step 1: Creating a Local _ViewImports.cshtml
ধরে নাও, তুমি শুধু Home ফোল্ডারের View গুলোর জন্য Namespace ইমপোর্ট করতে চাও।
- Views/Home/ ফোল্ডারে রাইট ক্লিক করো।
- Add View -> Razor View - Empty সিলেক্ট করো।
- ফাইলের নাম দাও ঠিক এভাবে: _ViewImports.cshtml (বানান যেন ভুল না হয়)।
- এরপর ফাইলের ভেতরে নিচের কোডটুকু লেখো:
<!-- Views/Home/_ViewImports.cshtml -->
@* এই ফোল্ডারের সব View এর জন্য Models নেমস্পেস ইমপোর্ট করা হলো *@
@using MyWebApp.Models
Result (ফলাফল): এখন তুমি Index.cshtml, Details.cshtml বা PersonWithProduct.cshtml ফাইলের একদম উপর থেকে @using MyWebApp.Models লাইনটি নিশ্চিন্তে মুছে ফেলতে পারবে। অ্যাপ্লিকেশন কোনো এরর দেবে না।
📌 Global vs Local _ViewImports.cshtml [Priority: 10/10]
লেকচারের দ্বিতীয়াংশে ইনস্ট্রাক্টর বুঝিয়েছেন যে, তুমি চাইলে একাধিক _ViewImports.cshtml ফাইল তৈরি করতে পারো।
1. Global ViewImports (Views ফোল্ডারের ভেতরে)
তুমি যদি চাও যে তোমার অ্যাপ্লিকেশনের সব Controller-এর সব View (যেমন Home, Products, Orders) একটি নির্দিষ্ট Namespace পাবে, তবে ফাইলটি সরাসরি Views/ ফোল্ডারে তৈরি করতে হবে।
<!-- Views/_ViewImports.cshtml (Global) -->
@* এটি পুরো প্রজেক্টের সব View ফাইলে অ্যাপ্লাই হবে *@
@using System.Collections
@using Microsoft.AspNetCore.Mvc.TagHelpers <!-- রিয়েল ওয়ার্ল্ডে এটি সবচেয়ে বেশি লাগে -->
2. Local ViewImports (Controller স্পেসিফিক ফোল্ডারে)
যেমনটি আমরা Views/Home/ ফোল্ডারে করেছি। এটি শুধু Home ফোল্ডারের View গুলোর জন্যই কাজ করবে, Products ফোল্ডারের কোনো View এর সুবিধা পাবে না।
🔄 Execution Order (কাজের ধারা)
ধরে নাও তোমার Index.cshtml ফাইলটি Views/Home/ ফোল্ডারে আছে। কম্পাইলার যখন এই ফাইলটি কম্পাইল করবে, সে কীভাবে কাজ করবে?
- প্রথমে সে রুট লেভেলের (Global) Views/_ViewImports.cshtml থেকে সব @using তুলে আনবে।
- এরপর সে ফোল্ডার লেভেলের (Local) Views/Home/_ViewImports.cshtml থেকে সব @using তুলে আনবে।
- সবশেষে সে দুই জায়গার Namespace-গুলোকেই তোমার Index.cshtml ফাইলে মার্জ (Merge) করে দেবে।
অর্থাৎ, গ্লোবাল এবং লোকাল—দুটোই একসাথে কাজ করে।
⭐ Best Practices (Modern .NET 10 Context)
- Always Use a Global _ViewImports.cshtml: রিয়েল-ওয়ার্ল্ড প্রজেক্টে সাধারণত Controller স্পেসিফিক (Local) _ViewImports খুব একটা তৈরি করা হয় না। প্রজেক্ট তৈরি করার শুরুতেই Views ফোল্ডারে একটি গ্লোবাল _ViewImports.cshtml ফাইল তৈরি করে সেখানে প্রয়োজনীয় সব Namespace ইমপোর্ট করে দেওয়া হয়। Standard Global _ViewImports for .NET 10:
@using MyWebApp
@using MyWebApp.Models
@using MyWebApp.ViewModels
@* Tag Helpers এনাবল করার জন্য এটি থাকা বাধ্যতামূলক *@
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
2. **Keep it Clean:**
_ViewImports.cshtml ফাইলে **কখনোই কোনো HTML বা C# লজিক লেখা উচিত নয়**। এর কাজ শুধু Namespace ইমপোর্ট করা (@using) এবং Tag Helper এনাবল করা (@addTagHelper)। তুমি যদি এখানে কোনো HTML লেখো, সেটি কোনো View-তে রেন্ডার হবে না, বরং কম্পাইলেশন এরর দিতে পারে। (HTML কমন করার জন্য _Layout.cshtml ব্যবহৃত হয়, যা তুমি পরে শিখবে)।