হাসিব, চলো তোমার কোর্সের ১০০ নম্বর লেকচারটি নিয়ে বিস্তারিত আলোচনা করি। এটি 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 ইমপোর্ট করতে চাও।

  1. Views/Home/ ফোল্ডারে রাইট ক্লিক করো।
  2. Add View -> Razor View - Empty সিলেক্ট করো।
  3. ফাইলের নাম দাও ঠিক এভাবে: _ViewImports.cshtml (বানান যেন ভুল না হয়)।
  4. এরপর ফাইলের ভেতরে নিচের কোডটুকু লেখো:
<!-- 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/ ফোল্ডারে আছে। কম্পাইলার যখন এই ফাইলটি কম্পাইল করবে, সে কীভাবে কাজ করবে?

  1. প্রথমে সে রুট লেভেলের (Global) Views/_ViewImports.cshtml থেকে সব @using তুলে আনবে।
  2. এরপর সে ফোল্ডার লেভেলের (Local) Views/Home/_ViewImports.cshtml থেকে সব @using তুলে আনবে।
  3. সবশেষে সে দুই জায়গার Namespace-গুলোকেই তোমার Index.cshtml ফাইলে মার্জ (Merge) করে দেবে।

অর্থাৎ, গ্লোবাল এবং লোকাল—দুটোই একসাথে কাজ করে।


⭐ Best Practices (Modern .NET 10 Context)

  1. 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 ব্যবহৃত হয়, যা তুমি পরে শিখবে)।