হ্যালো হাসিব! আজকের লেকচারটি হলো “_ViewStart.cshtml” নিয়ে। আগের লেকচারে আমরা যে সমস্যার কথা বলেছিলাম (প্রতিটি ফাইলে Layout-এর পাথ বারবার লেখা), আজকের এই টপিকটি ঠিক সেই সমস্যারই স্মার্ট সমাধান।
চলো প্রথমে একটি কুইক সামারি দেখে নিই।
📝 শর্ট সামারি (Quick Revision)
- Purpose: একাধিক View-এর জন্য একটি কমন Layout নির্ধারণ করে দেওয়া, যাতে প্রতিটি View ফাইলে বারবার
Layout = "..."লিখতে না হয়। - Execution Time: এটি সবসময় Actual View এক্সিকিউট হওয়ার ঠিক আগে এক্সিকিউট হয়।
- Global vs Local:
Viewsফোল্ডারের রুটে থাকলে এটি Global (পুরো প্রজেক্টের জন্য)। আর নির্দিষ্ট কোনো Controller-এর ফোল্ডারে (যেমনViews/Home) থাকলে সেটি Local। - Overriding Rule: Local
_ViewStartসবসময় Global_ViewStart-কে Override করতে পারে। আবার নির্দিষ্ট কোনো View-এর ভেতরের Layout ডিক্লেয়ারেশন, Local/Global দুটিকেই Override করতে পারে। - Limitation: এই ফাইলে শুধুমাত্র Layout-এর পাথ সেট করা যায়। কোনো HTML Content বা Namespace Import (
@using) এখানে কাজ করে না।
🚀 বিস্তারিত আলোচনা (Comprehensive Breakdown)
১. _ViewStart.cshtml কী এবং কেন প্রয়োজন? (Priority: 10/10)
কেন (Why): ধরো, তোমার প্রজেক্টে ১০০টি View আছে। যদি তুমি _ViewStart ব্যবহার না করো, তবে তোমাকে ১০০টি ফাইলের শুরুতেই Layout = "~/Views/Shared/_Layout.cshtml"; কথাটি লিখতে হবে। এটি DRY (Don’t Repeat Yourself) প্রিন্সিপালের সম্পূর্ণ বিরোধী। ভবিষ্যতে যদি Layout ফাইলের নাম পরিবর্তন করতে হয়, তবে ১০০ জায়গায় গিয়ে ম্যানুয়ালি চেঞ্জ করাটা রীতিমতো অসম্ভব।
কী (What): _ViewStart.cshtml হলো একটি স্পেশাল Razor ফাইল, যা MVC ফ্রেমওয়ার্কে কমন লেআউট কনফিগারেশন সেট করার জন্য ব্যবহৃত হয়। এই ফাইলে একবার লেআউট সেট করে দিলে, নির্দিষ্ট ফোল্ডারের সব View স্বয়ংক্রিয়ভাবে সেই Layout পেয়ে যায়।
২. Global vs Local _ViewStart (Priority: 9/10)
লেকচারে ইনস্ট্রাক্টর দুটি জায়গার কথা বলেছেন:
- Local
_ViewStart: তুমি যদিViews/Home/ফোল্ডারের ভেতরে এই ফাইলটি তৈরি করো, তবে শুধুমাত্র Home Controller-এর View গুলো (Index, About, Contact) এই লেআউট পাবে। Products Controller-এর View গুলো পাবে না (যেমনটি ভিডিওতে দেখানো হয়েছে)। - Global
_ViewStart: তুমি যদি ফাইলটিকে সরাসরিViews/ফোল্ডারের রুটে রাখো, তবে এটি পুরো প্রজেক্টের সব Controller-এর View-এর জন্য অ্যাপ্লিকেবল হবে। রিয়েল লাইফ প্রজেক্টে সবসময় গ্লোবাল পদ্ধতিটিই ব্যবহার করা হয়।
Code Implementation (Global):
<!-- Location: Views/_ViewStart.cshtml -->
@{
// পুরো অ্যাপ্লিকেশনের সব View ডিফল্টভাবে এই লেআউটটি পাবে
Layout = "~/Views/Shared/_Layout.cshtml";
// নোট: .NET 10 এ তুমি শুধু Layout = "_Layout"; লিখলেও ফ্রেমওয়ার্ক নিজে থেকে Shared ফোল্ডারে খুঁজে নেবে।
}
৩. Execution Sequence এবং Overriding (Priority: 10/10)
এই কনসেপ্টটি ইন্টারভিউ এবং আর্কিটেকচার বোঝার জন্য খুবই গুরুত্বপূর্ণ। MVC ফ্রেমওয়ার্ক নিচের সিরিয়ালে ফাইলগুলো এক্সিকিউট করে:
Views/_ViewStart.cshtml(Global Level)Views/Home/_ViewStart.cshtml(Local Level - যদি থাকে)Views/Home/Index.cshtml(Actual View Level)
Overriding Rule: ডাউনস্ট্রিম সবসময় আপস্ট্রিমকে Override করতে পারে।
ভিডিওর শেষের দিকের উদাহরণটি লক্ষ্য করো: ইনস্ট্রাক্টর _ProductsLayout.cshtml নামে একটি নতুন Layout তৈরি করেছেন (যেখানে Navigation Bar নেই, শুধু flexbox আছে)। তিনি চেয়েছেন পুরো প্রজেক্টে _Layout.cshtml থাকুক, কিন্তু শুধুমাত্র Search.cshtml পেজটিতে এই নতুন Layout-টি বসুক।
এর জন্য তিনি যা করেছেন:
<!-- Location: Views/Products/Search.cshtml -->
@{
// এটি _ViewStart এর গ্লোবাল সেটিংকে Override করে দেবে শুধুমাত্র এই পেজটির জন্য
Layout = "~/Views/Shared/_ProductsLayout.cshtml";
}
<h1>Search Products</h1>
<p>This view uses a completely different layout!</p>
রেজাল্ট: যখন Search.cshtml রান হবে, প্রথমে গ্লোবাল _ViewStart বলবে “Layout হবে _Layout”। কিন্তু যখনই সে Search.cshtml-এর ভেতরে ঢুকবে, সে দেখবে ডেভেলপার ম্যানুয়ালি অন্য একটি Layout বলে দিয়েছে। তাই সে গ্লোবালটাকে ইগনোর করে নতুনটাই রেন্ডার করবে।
৪. _ViewStart এর সীমাবদ্ধতা (Limitations) (Priority: 8/10)
কী (What): এই ফাইলটি কোনো সাধারণ View নয়। তুমি চাইলে এর ভেতরে যা খুশি তাই লিখতে পারবে না। নিয়ম:
- এখানে কোনো HTML কোড (যেমন
<h1>,<div>) লেখা যাবে না। লিখলেও তা লেআউটে রেন্ডার হবে না। - এখানে
@usingদিয়ে কোনো Namespace ইমপোর্ট করা উচিত নয়। Namespace ইমপোর্ট করার জন্য_ViewImports.cshtmlনামে আলাদা ফাইল আছে (যা আমরা আগের লেকচারগুলোতে দেখেছি)। - এর একমাত্র কাজ হলো
Layoutপ্রপার্টি অ্যাসাইন করা।
⌨️ Editor Shortcuts (VS & VS Code)
- Visual Studio: কোনো ফোল্ডারে নতুন View অ্যাড করার সময় শর্টকাট হলো: ফোল্ডারের ওপর ক্লিক করে
Ctrl + Shift + A(Add New Item) প্রেস করা এবং সেখানে Razor View সিলেক্ট করে_ViewStart.cshtmlনাম দেওয়া। - VS Code: ফোল্ডারে রাইট ক্লিক করে “New File” সিলেক্ট করো এবং সরাসরি
_ViewStart.cshtmlলিখে এন্টার দাও।
🏆 Best Practices & .NET 10 Context
Best Practices:
- Keep it Global: সবসময়
_ViewStart.cshtmlফাইলটিকেViewsফোল্ডারের রুটে রাখবে। Controller specific ফোল্ডারে এটি না রাখাই ভালো, কারণ এতে প্রজেক্টের আর্কিটেকচার জটিল হয়ে যায়। - No Logic: এই ফাইলের ভেতরে কোনো
if-elseবা কমপ্লেক্স C# লজিক লিখবে না (যদিও লেখা যায়)। Layout সিলেকশন লজিকগুলো Actual View বা Controller-এ রাখা উচিত। - Use Short Path: আধুনিক ভার্সনগুলোতে পুরো পাথ (
~/Views/Shared/_Layout.cshtml) না লিখে শুধু ফাইলের নাম (_Layout) লেখাটা ক্লিন কোডিং স্ট্যান্ডার্ড।
.NET 10 Context (MVC):
MVC আর্কিটেকচারের ক্ষেত্রে _ViewStart.cshtml-এর এই ব্যবহার .NET Core 1.0 থেকে শুরু করে আধুনিক .NET 10 পর্যন্ত একদম সেম আছে। মাইক্রোসফট এই মেকানিজমে কোনো পরিবর্তন আনেনি, কারণ এটি অত্যন্ত স্টেবল এবং কার্যকরী একটি প্যাটার্ন।
উদাহরণ (.NET 10 Clean Syntax):
<!-- Views/_ViewStart.cshtml -->
@{
Layout = "_Layout"; // .NET 10 এ তিল্ড (~) বা পুরো পাথ লেখার দরকার নেই।
}
এই একটি ফাইলের মাধ্যমেই তুমি তোমার পুরো MVC প্রজেক্টের কোড রিপিটেশন প্রায় শূন্যের কোঠায় নামিয়ে আনতে পারো!