হ্যালো হাসিব! কোর্স আউটলাইন অনুযায়ী, আমরা এখন Section 11: View Components-এর দ্বিতীয় লেকচার “Creating View Components - Part 2” (Lecture 121)-এ আছি। এই লেকচারে আমরা দেখবো কীভাবে View Component-এর ভিউ ফাইল তৈরি করতে হয়, কীভাবে একে কল করতে হয় এবং এর ট্যাগ হেল্পার মেকানিজম কীভাবে কাজ করে।
চলো, পুরো প্রসেসটিকে ধাপে ধাপে ডিকোড করে ফেলি।
সারসংক্ষেপ (Quick Revision List)
- The Default View Location: View Component-এর HTML ফাইলটি সবসময়
Views/Shared/Components/[ComponentName]/Default.cshtmlপাথে রাখতে হয়। - Changing View Name: যদি ভিউ ফাইলের নাম
Default.cshtmlনা দিয়ে অন্য কিছু (যেমন:Sample.cshtml) দেওয়া হয়, তবেInvokeAsync()মেথডেreturn View("Sample");লিখে সেটা স্পষ্টভাবে বলে দিতে হবে। - Invocation Way 1 (Method Call): ভিউ থেকে
@await Component.InvokeAsync("Grid")ব্যবহার করে View Component কল করা যায়। - Invocation Way 2 (Tag Helper):
_ViewImports.cshtml-এ പ്രোজেক্ট অ্যাসেম্বলি ইমপোর্ট করার পর<vc:grid></vc:grid>(Slug Case) ব্যবহার করে কল করা যায়। - Execution Flow: Parent View -> View Component Class (
InvokeAsync) -> Partial View -> Back to Parent View।
Comprehensive Breakdown
১. View Component-এর View ফাইল তৈরি করা [Priority: 10/10]
আগের লেকচারে আমরা GridViewComponent ক্লাস বানিয়েছিলাম। এই ক্লাসের কাজ হলো একটি ভিউ রিটার্ন করা। কিন্তু সেই ভিউ ফাইলটি কোথায় থাকবে? ASP.NET Core-এ এর জন্য একটি স্ট্রিক্ট (Strict) লোকেশন আছে।
Step A: ফোল্ডার স্ট্রাকচার তৈরি
Views/Sharedফোল্ডারে যাও।- সেখানে
Componentsনামে একটি ফোল্ডার তৈরি করো (এই নামটা ফিক্সড, চেঞ্জ করা যাবে না)। Components-এর ভেতরেGridনামে আরেকটি ফোল্ডার তৈরি করো (যেহেতু আমাদের কম্পোনেন্টের নামGridViewComponent, তাই পেছনের ‘ViewComponent’ বাদ দিয়ে শুধুGridনাম হবে)।
Step B: View ফাইল তৈরি
Views/Shared/Components/Gridফোল্ডারেDefault.cshtmlনামে একটি Razor View Empty ফাইল তৈরি করো।- সেখানে একটি বেসিক HTML টেবিল ডিজাইন করো।
Code Implementation (Views/Shared/Components/Grid/Default.cshtml):
<div class="box">
<h2>List of Persons</h2>
<table class="w-100">
<thead>
<tr>
<th>S.No</th>
<th>Name</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>John Doe</td>
</tr>
<!-- More rows here -->
</tbody>
</table>
</div>
২. View ফাইলের নাম পরিবর্তন করা (Custom View Name) [Priority: 8/10]
ডিফল্টভাবে ফ্রেমওয়ার্ক Default.cshtml ফাইল খোঁজে। কিন্তু তুমি যদি ফাইলের নাম পরিবর্তন করে Sample.cshtml রাখো, তাহলে তুমি Error খাবে, কারণ ফ্রেমওয়ার্ক ফাইলটি খুঁজে পাবে না।
- The Fix: যদি ফাইলের নাম ভিন্ন হয়, তবে C# ক্লাসের
return View()স্টেটমেন্টে সেই নাম বলে দিতে হবে।
Code Implementation (ViewComponents/GridViewComponent.cs):
public async Task<IViewComponentResult> InvokeAsync()
{
// যদি ফাইলের নাম Default.cshtml না হয়ে Sample.cshtml হয়
return View("Sample");
}
৩. View Component-কে কল করার উপায় (Invocation Methods) [Priority: 10/10]
এখন আমাদের View Component রেডি। প্যারেন্ট ভিউ (যেমন: Index.cshtml বা About.cshtml) থেকে একে ২ ভাবে কল করা যায়।
Way 1: Asynchronous Method Call (Classic Way) এটি সবচেয়ে কমন পদ্ধতি।
<!-- Views/Home/Index.cshtml -->
<h2>Welcome to Home Page</h2>
<!-- Invoking View Component -->
@await Component.InvokeAsync("Grid")
Way 2: Tag Helper Call (Modern Way) [Priority: 10/10]
এটি HTML ট্যাগ-এর মতো দেখতে হয় বলে ক্লিন কোড লেখা যায়। তবে এটি কাজ করানোর জন্য _ViewImports.cshtml ফাইলে তোমার প্রোজেক্ট অ্যাসেম্বলি ইমপোর্ট করতে হবে।
- Step A:
_ViewImports.cshtml-এ অ্যাসেম্বলি অ্যাড করা:
<!-- Views/_ViewImports.cshtml -->
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@addTagHelper *, ViewComponentsExample <!-- এখানে 'ViewComponentsExample' হলো তোমার প্রোজেক্টের নাম -->
- Step B: ভিউ ফাইলে
vc:প্রিফিক্স ব্যবহার করে কল করা:
<!-- Views/Home/About.cshtml -->
<h2>About Us</h2>
<!-- Using Tag Helper -->
<vc:grid></vc:grid>
- Slug Case Rule: যদি তোমার View Component-এর নাম CamelCase বা PascalCase হয় (যেমন:
ProductList), তবে Tag Helper-এ লেখার সময় তা kebab-case (বা slug case)-এ লিখতে হবে (যেমন:<vc:product-list></vc:product-list>)।
৪. Execution Flow (কীভাবে এক্সিকিউট হচ্ছে?) [Priority: 9/10]
লেকচারার ব্রেকপয়েন্ট দিয়ে ফ্লো-টা বুঝিয়েছেন:
- ইউজার
Home/Indexরিকোয়েস্ট করে। Index.cshtmlরেন্ডার হওয়া শুরু হয়।- যখন লাইনটি
@await Component.InvokeAsync("Grid")-এ আসে, এক্সিকিউশন থেমে যায় এবং কলটি চলে যায়GridViewComponent.cs-এরInvokeAsyncমেথডে। - সেখানে (C#-এ) ডাটাবেস কল বা লজিক এক্সিকিউট হয় (আপাতত ফাঁকা)।
- এরপর মেথডটি
return View()কল করেDefault.cshtml-কে এক্সিকিউট করে। Default.cshtml-এর রেন্ডার করা HTML ফিরে আসেIndex.cshtml-এর সেই নির্দিষ্ট জায়গায়।- সবশেষে পুরো পেজটি ব্রাউজারে সার্ভ হয়।
VS / VS Code Shortcuts
- Rename File: এক্সপ্লোরারে ফাইলের উপর ক্লিক করে
F2চাপলে রিনেম করা যায়। - Format Document:
Shift + Alt + F(HTML/Razor কোড সুন্দরভাবে এলাইন করার জন্য)।
Best Practices & .NET 10 Context
Best Practices for View Components:
- Prefer Tag Helpers:
Component.InvokeAsyncএর চেয়ে<vc:component-name>ট্যাগ হেল্পার ব্যবহার করা বেশি স্ট্যান্ডার্ড, কারণ এটি HTML-এর সাথে মিশে থাকে এবং রিডযোগ্যতা (Readability) বাড়ায়। - Keep UI Simple: View Component-এর কাজ ডাটা প্রসেস করে UI-কে দেওয়া। এর Partial View (
Default.cshtml)-এ কোনো লজিক (C# if-else ছাড়া) লেখা উচিত নয়।
.NET 10 Context: ASP.NET Core 10-এ View Component-এর Invocation, Tag Helper, এবং ফোল্ডার স্ট্রাকচার .NET 6-এর মতোই হুবহু এক।
তবে মডার্ন .NET 10-এ _ViewImports.cshtml এ ট্যাগ হেল্পার ইমপোর্ট করার কনসেপ্টটি এখনো বহাল আছে, কারণ Tag Helpers সিকিউরড এবং ফাস্ট এক্সিকিউশন নিশ্চিত করে।
<!-- Modern .NET 10 Standard Practice -->
<vc:grid></vc:grid>
হাসিব, View Component তৈরি করা এবং তা কল করার এই কনসেপ্ট কি ক্লিয়ার হয়েছে? রেডি হলে আমরা নেক্সট লেকচার “View Components with ViewData”-তে মুভ করতে পারি!