بیایید کد ویوی GetMenu.cshtml را که برای نمایش منوی سایت استفاده میشود بررسی کنیم.
توضیحات کد:
اضافه کردن فضای نامها و مدل:
csharp
@using Test_Store.Application.Services.Common.Queries.GetMenuItem;
@model List<MenuItemDto>
@using برای استفاده از فضای نام سرویسهای مورد نیاز برای دریافت دادههای منو.
@model برای تعریف مدل دادهای که به ویو ارسال میشود. در اینجا مدل List<MenuItemDto> است که شامل لیستی از آیتمهای منو است.
تنظیم Layout:
csharp
@{
Layout = null;
}
Layout = null
به این معنا است که این ویو از هیچ Layout استفاده نمیکند.
نمایش منوها:
از @foreach برای پیمایش مدل (لیست آیتمهای منو) و نمایش هر آیتم منو استفاده شده است.
html
@foreach (var item in Model)
{
<li id="nav-menu-item" class="menu-item nav-overlay">
<a href="#" class="current-link-menu">
@item.Name
</a>
@if (item.Child.Count() > 0)
{
<ul class="sub-menu is-mega-menu-small">
@foreach (var itemChild in item.Child)
{
<li class="menu-mega-item menu-item-type-mega-menu item-small">
<a href="~/products/index?CatId=@itemChild.CatId" class="mega-menu-link">
@itemChild.Name
</a>
</li>
}
</ul>
}
</li>
}
لیست اصلی منو (<li id="nav-menu-item" class="menu-item nav-overlay">):
این کد هر آیتم منوی اصلی را نمایش میدهد.
@item.Name:
نام آیتم منو را نمایش میدهد.
بررسی وجود زیردستهها (@if (item.Child.Count() > 0)):
اگر آیتم منو دارای زیردسته باشد، زیردستهها نمایش داده میشوند.
لیست زیردستهها (<ul class="sub-menu is-mega-menu-small">):
از @foreach برای پیمایش زیردستهها و نمایش آنها استفاده شده است.
@itemChild.Name:
نام زیردسته را نمایش میدهد.
لینک هر زیردسته به صفحهای با شناسه دستهبندی (CatId) اشاره میکند.
نتیجهگیری:
این کد به شما امکان میدهد تا یک منوی سایت با استفاده از دادههای دریافتی از سرویس GetMenuItemService ایجاد کنید. آیتمهای منو و زیردستههای آنها به صورت داینامیک از مدل List<MenuItemDto> دریافت و نمایش داده میشوند. این طراحی به شما کمک میکند تا منوهای سایت خود را به صورت پویا مدیریت و نمایش دهید.
بیایید کد سرویس GetCategoryService و اینترفیس IGetCategoryService را که برای جستجوی دستهبندیها استفاده میشود بررسی کنیم.
توضیحات کد:
تعریف اینترفیس IGetCategoryService:
csharp
public interface IGetCategoryService
{
ResultDto<List<CategoryDto>> Execute();
}
این اینترفیس یک متد Execute تعریف میکند که هیچ پارامتری دریافت نمیکند و یک ResultDto<List<CategoryDto>> را بازمیگرداند.
این متد به منظور دریافت لیست دستهبندیها استفاده میشود.
کلاس GetCategoryService:
فیلدهای خصوصی و سازنده:
csharp
public class GetCategoryService : IGetCategoryService
{
private readonly IDataBaseContext _context;
public GetCategoryService(IDataBaseContext context)
{
_context = context;
}
}
این کلاس شامل یک فیلد خصوصی _context از نوع IDataBaseContext و یک سازنده است که این فیلد را مقداردهی اولیه میکند.
متد Execute:
csharp
public ResultDto<List<CategoryDto>> Execute()
{
var category = _context.Categories
.Where(p => p.ParentCategoryId == null)
.ToList()
.Select(p => new CategoryDto
{
CatId = p.Id,
CategoryName = p.Name,
}).ToList();
return new ResultDto<List<CategoryDto>>()
{
Data = category,
IsSuccess = true,
};
}
این متد لیست دستهبندیها را از دیتابیس دریافت میکند و سپس آنها را به صورت یک لیست CategoryDto بازمیگرداند.
از Where برای فیلتر کردن دستهبندیها که ParentCategoryId آنها null است استفاده میشود. این یعنی فقط دستهبندیهای اصلی (بدون والد) را دریافت میکند.
هر دستهبندی به یک CategoryDto تبدیل میشود که شامل شناسه دستهبندی (CatId) و نام دستهبندی (CategoryName) است.
نتیجه به عنوان یک ResultDto<List<CategoryDto>> شامل لیست دستهبندیها و وضعیت موفقیتآمیز بودن عملیات بازگردانده میشود.
کلاس CategoryDto:
csharp
public class CategoryDto
{
public long CatId { get; set; }
public string CategoryName { get; set; }
}
این کلاس شامل جزئیات دستهبندی است.
CatId:
شناسه دستهبندی.
CategoryName:
نام دستهبندی.
نتیجهگیری:
این کد به شما امکان میدهد تا لیست دستهبندیهای اصلی را از دیتابیس دریافت کنید. از اینترفیس IGetCategoryService برای تعریف قرارداد و از کلاس GetCategoryService برای پیادهسازی این قرارداد استفاده میشود. دادهها به صورت یک لیست CategoryDto بازگردانده میشوند که شامل شناسه و نام دستهبندیها است. این طراحی به شما کمک میکند تا دستهبندیها را به صورت ساختاریافته مدیریت و نمایش دهید.
بیایید کد کلاس Search که به عنوان یک ViewComponent در پروژه ASP.NET Core استفاده میشود را بررسی کنیم.
توضیحات کد:
تعریف کلاس Search:
csharp
public class Search : ViewComponent
{
private readonly IGetCategoryService _getCategoryService;
public Search(IGetCategoryService getCategoryService)
{
_getCategoryService = getCategoryService;
}
}
کلاس Search از کلاس پایه ViewComponent ارثبری میکند.
یک فیلد خصوصی _getCategoryService از نوع IGetCategoryService تعریف شده است.
سازنده کلاس Search فیلد _getCategoryService را از طریق تزریق وابستگی مقداردهی اولیه میکند.
متد Invoke:
csharp
public IViewComponentResult Invoke()
{
return View(viewName: "Search", _getCategoryService.Execute().Data);
}
متد Invoke برای اجرای ViewComponent استفاده میشود.
از سرویس IGetCategoryService برای دریافت دادههای دستهبندی استفاده میشود.
نتیجه دادههای دریافت شده به ویو با نام "Search" ارسال میشود.
پوشه ViewComponents:
پوشه ViewComponents در پروژههای ASP.NET Core معمولاً برای نگهداری کلاسهای ViewComponent استفاده میشود. این پوشه به شما کمک میکند تا کلاسهای ViewComponent خود را سازماندهی و مدیریت کنید.
فایل View مربوط به ViewComponent:
برای ViewComponent به نام Search، فایل View مربوطه باید در مسیر زیر قرار گیرد:
Views/Shared/Components/Search/Search.cshtml
نتیجهگیری:
کلاس Search به عنوان یک ViewComponent عمل میکند که منوی جستجو را با استفاده از سرویس IGetCategoryService دریافت و نمایش میدهد. ViewComponents به شما امکان میدهند تا بخشهای قابل استفاده مجدد و قابل تکرار از رابط کاربری (UI) را ایجاد کنید و آنها را در پروژههای ASP.NET Core خود به کار ببرید.
بیایید کد بخش از فایل کنترلر ProductsController را که مربوط به نمایش لیست محصولات است بررسی کنیم.
توضیحات کد:
تعریف متد Index:
csharp
public IActionResult Index(string Searchkey, long? CatId = null, int page = 1)
{
return View(_productFacad.GetProductForSiteService.Execute(Searchkey, page, CatId).Data);
}
این متد به نام Index برای نمایش لیست محصولات استفاده میشود.
سه پارامتر ورودی دارد:
Searchkey
از نوع string: کلید جستجو برای فیلتر کردن محصولات بر اساس متن جستجو شده توسط کاربر.
CatId
از نوع long? (nullable long): شناسه دستهبندی برای فیلتر کردن محصولات بر اساس دستهبندی. مقدار پیشفرض آن null است.
page
از نوع int: شماره صفحه برای صفحهبندی لیست محصولات. مقدار پیشفرض آن ۱ است.
دریافت و نمایش محصولات:
داخل متد Index، سرویس GetProductForSiteService از طریق فاساد محصولات (_productFacad) فراخوانی میشود:
csharp
_productFacad.GetProductForSiteService.Execute(Searchkey, page, CatId)
متد Execute در سرویس GetProductForSiteService اجرا میشود که محصولات را بر اساس کلید جستجو، دستهبندی و صفحهبندی مورد نظر دریافت میکند.
نتیجه این فراخوانی شامل دادههای محصولات است که به ویو ارسال میشود:
csharp
return View(_productFacad.GetProductForSiteService.Execute(Searchkey, page, CatId).Data);
این خط کد دادههای دریافت شده را به ویو مربوطه ارسال میکند تا در آنجا نمایش داده شوند.
نتیجهگیری:
این کد متد Index در کنترلر ProductsController را پیادهسازی میکند که برای نمایش لیست محصولات استفاده میشود. شامل پارامترهایی برای جستجو، فیلتر بر اساس دستهبندی، و صفحهبندی است. سرویس GetProductForSiteService از طریق فاساد محصولات برای دریافت دادههای محصولات فراخوانی میشود و نتیجه به ویو مربوطه ارسال میشود.
بیایید کد ویوی Search.cshtml را که برای بخش جستجوی محصولات در سایت استفاده میشود بررسی کنیم.
توضیحات کد:
اضافه کردن فضای نامها و مدل:
csharp
@using Test_Store.Application.Services.Common.Queries.GetCategory;
@model List<CategoryDto>;
@using
برای استفاده از فضای نام سرویسهای مورد نیاز برای دریافت دادههای دستهبندی.
@model
برای تعریف مدل دادهای که به ویو ارسال میشود. در اینجا مدل List<CategoryDto> است که شامل لیستی از دستهبندیها است.
تنظیم Layout:
csharp
@{
Layout = null;
}
Layout = null به این معنا است که این ویو از هیچ Layout استفاده نمیکند.
فرم جستجو:
html
<form asp-action="Index" asp-controller="Products" class="form-search ">
<input type="search" class="header-search-input" name="SearchKey" placeholder="نام کالا، برند و یا دسته مورد نظر خود را جستجو کنید…">
<div class="action-btns fa">
<button type="submit">
<i class="fa fa-search"></i>
</button>
<div class="search-filter">
<div class="form-ui ">
<div class="custom-select-ui">
<select class="right" name="CatId" asp-items="@(new SelectList(Model,"CatId","CategoryName"))">
<option>همه دسته ها</option>
</select>
</div>
</div>
</div>
</div>
</form>
فرم جستجو (<form>):
این فرم به اکشن Index در کنترلر Products ارسال میشود.
کلاس form-search برای استایلدهی به فرم جستجو استفاده شده است.
فیلد ورودی جستجو (<input type="search">):
فیلد ورودی جستجو از نوع search است که به کاربر امکان میدهد تا نام کالا، برند، یا دسته مورد نظر خود را جستجو کند.
نام این فیلد SearchKey است.
دکمه جستجو (<button type="submit">):
این دکمه برای ارسال فرم جستجو استفاده میشود.
آیکون fa fa-search برای نمایش آیکون جستجو از کتابخانه FontAwesome استفاده میشود.
فیلتر دستهبندی (<select>):
این فیلتر به کاربر امکان میدهد تا دستهبندی مورد نظر خود را انتخاب کند.
نام این فیلد CatId است.
از SelectList برای پر کردن گزینههای select با دادههای دستهبندی استفاده میشود. دادهها از مدل List<CategoryDto> دریافت میشوند.
گزینه پیشفرض "همه دسته ها" است که به کاربر امکان میدهد همه دستهبندیها را مشاهده کند.
نتیجهگیری:
این کد به شما امکان میدهد تا یک فرم جستجوی محصولات در سایت خود ایجاد کنید. شامل فیلد ورودی برای جستجوی نام کالا، برند یا دسته، دکمه جستجو با آیکون جستجو، و فیلتر دستهبندی است. دادههای دستهبندی از مدل List<CategoryDto> دریافت میشوند و به گزینههای select افزوده میشوند. این طراحی به کاربران کمک میکند تا به راحتی محصولات مورد نظر خود را جستجو و فیلتر کنند.
بیایید کد بخشی از فایل _Layout.cshtml که مربوط به نمایش ViewComponent Search است بررسی کنیم.
توضیحات کد:
html
<div class="col-md-6">
@* viewcomponent search *@
@await Component.InvokeAsync("Search")
</div>
ساختار و استایل:
html
<div class="col-md-6">
این خط کد یک عنصر div با کلاس col-md-6 ایجاد میکند.
کلاس col-md-6 از فریمورک Bootstrap استفاده میکند تا عرض این div را به اندازه ۶ ستون از ۱۲ ستون موجود در سیستم شبکهبندی (grid system) تنظیم کند.
نمایش ViewComponent Search:
csharp
@* viewcomponent search *@
@await Component.InvokeAsync("Search")
این قسمت از کد، یک ViewComponent به نام Search را بهصورت غیرهمزمان (async) فراخوانی میکند.
@await Component.InvokeAsync("Search"):
این خط کد ViewComponent Search را اجرا میکند و نتیجه آن را در اینجا نمایش میدهد.
کامنت @* viewcomponent search *@ به عنوان توضیحی برای مشخص کردن اینکه این بخش مربوط به ViewComponent Search است، استفاده شده است.
نتیجهگیری:
این کد در فایل _Layout.cshtml قرار دارد و وظیفه آن نمایش ViewComponent Search است. ViewComponent Search به عنوان یک بخش قابل استفاده مجدد از رابط کاربری (UI) عمل میکند که در اینجا به طور خاص برای جستجو در محصولات استفاده میشود. استفاده از ViewComponents به شما امکان میدهد تا بخشهای مختلف UI را به صورت ماژولار و قابل استفاده مجدد طراحی کنید و آنها را در صفحات مختلف وبسایت خود به کار ببرید.
بیایید کد بخشی از فایل _Layout.cshtml که مربوط به نمایش منوی ناوبری است را بررسی کنیم.
توضیحات کد:
ساختار و استایل:
html
<div class="col-md-12">
این خط کد یک عنصر div با کلاس col-md-12 ایجاد میکند.
کلاس col-md-12 از فریمورک Bootstrap استفاده میکند تا عرض این div را به اندازه ۱۲ ستون از ۱۲ ستون موجود در سیستم شبکهبندی (grid system) تنظیم کند، یعنی عرض کامل.
لیست منو:
html
<ul>
<li id="nav-menu-item" class="menu-item nav-overlay">
<a href="~/home" class="current-link-menu">
صفحه اصلی
</a>
</li>
@* ViewComponent Menu *@
@await Component.InvokeAsync("GetMenu")
<li id="nav-menu-item" class="menu-item nav-overlay">
<a href="#" class="current-link-menu">
درباره ما
</a>
</li>
<li id="nav-menu-item" class="menu-item nav-overlay">
<a href="#" class="current-link-menu">
تماس با ما
</a>
</li>
</ul>
لیست ناوبری (<ul>):
این خط کد یک لیست بدوننظم (ul) ایجاد میکند که شامل آیتمهای ناوبری است.
آیتمهای منوی ناوبری:
هر آیتم منوی ناوبری (<li>) شامل یک لینک (<a>) است که به صفحه مشخصی ارجاع میدهد.
صفحه اصلی:
html
<li id="nav-menu-item" class="menu-item nav-overlay">
<a href="~/home" class="current-link-menu">
صفحه اصلی
</a>
</li>
این آیتم منوی ناوبری به صفحه اصلی سایت (~/home) اشاره میکند.
نمایش ViewComponent GetMenu:
csharp
@* ViewComponent Menu *@
@await Component.InvokeAsync("GetMenu")
این قسمت از کد، ViewComponent GetMenu را بهصورت غیرهمزمان (async) فراخوانی میکند.
@await Component.InvokeAsync("GetMenu"):
این خط کد ViewComponent GetMenu را اجرا میکند و نتیجه آن را در اینجا نمایش میدهد.
کامنت @* ViewComponent Menu *@ به عنوان توضیحی برای مشخص کردن اینکه این بخش مربوط به ViewComponent GetMenu است، استفاده شده است.
درباره ما و تماس با ما:
html
<li id="nav-menu-item" class="menu-item nav-overlay">
<a href="#" class="current-link-menu">
درباره ما
</a>
</li>
<li id="nav-menu-item" class="menu-item nav-overlay">
<a href="#" class="current-link-menu">
تماس با ما
</a>
</li>
این آیتمهای منوی ناوبری به صفحات "درباره ما" و "تماس با ما" اشاره میکنند.
نتیجهگیری:
این کد در فایل _Layout.cshtml قرار دارد و وظیفه آن نمایش منوی ناوبری در سایت است. شامل لینکهای به صفحه اصلی، صفحه "درباره ما"، و صفحه "تماس با ما" است. علاوه بر این، ViewComponent GetMenu برای نمایش منوی داینامیک که از سرویس مربوطه دادهها را دریافت میکند، فراخوانی میشود. این طراحی به شما امکان میدهد تا منوی ناوبری سایت خود را به صورت ساختاریافته و پویا مدیریت کنید.
بیایید این بخش از کد Program.cs را که مربوط به افزودن سرویسها به کانتینر وابستگیها است بررسی کنیم.
توضیحات کد:
csharp
builder.Services.AddScoped<IGetMenuItemService, GetMenuItemService>();
builder.Services.AddScoped<IGetCategoryService, GetCategoryService>();
افزودن سرویسها به کانتینر وابستگیها:
این خطوط کد سرویسهای IGetMenuItemService و IGetCategoryService را به کانتینر وابستگیها اضافه میکنند.
از متد AddScoped برای افزودن این سرویسها استفاده شده است.
متد AddScoped:
AddScoped
یک متد از IServiceCollection است که یک سرویس را با زمان حیات scoped ثبت میکند.
سرویسهایی که به صورت scoped ثبت میشوند، برای هر درخواست HTTP جدید ایجاد میشوند و در طول عمر آن درخواست HTTP به اشتراک گذاشته میشوند.
تعریف سرویسها:
IGetMenuItemService
به عنوان اینترفیس سرویس و GetMenuItemService به عنوان پیادهسازی آن ثبت میشود:
csharp
builder.Services.AddScoped<IGetMenuItemService, GetMenuItemService>();
این خط کد تضمین میکند که هر زمان که IGetMenuItemService نیاز باشد، نمونهای از GetMenuItemService ایجاد و تزریق شود.
IGetCategoryService
به عنوان اینترفیس سرویس و GetCategoryService به عنوان پیادهسازی آن ثبت میشود:
csharp
builder.Services.AddScoped<IGetCategoryService, GetCategoryService>();
این خط کد تضمین میکند که هر زمان که IGetCategoryService نیاز باشد، نمونهای از GetCategoryService ایجاد و تزریق شود.
نتیجهگیری:
این بخش از کد Program.cs، سرویسهای IGetMenuItemService و IGetCategoryService را به کانتینر وابستگیها (Dependency Injection Container) اضافه میکند و زمان حیات آنها را به صورت scoped تعیین میکند. این طراحی به شما کمک میکند تا سرویسهای مورد نیاز را به صورت خودکار به کنترلرها و سایر اجزای برنامه تزریق کنید و مدیریت وابستگیها را سادهتر کنید.
توضیحات:
username = "admin" و password = "1234"
اینترفیس و سرویس تولید عدد تصادفی:
اینترفیس IRandomNumberService متدی برای تولید عدد تصادفی تعریف میکند.
کلاس RandomNumberService این متد را پیادهسازی میکند و عدد تصادفی تولید میکند.
تنظیم Program.cs:
سرویس تولید عدد تصادفی در Program.cs ثبت میشود تا در کنترلرها قابل دسترسی باشد.
کنترلر AccountController:
متدهای لاگین و داشبورد در این کنترلر قرار دارند.
متد لاگین از سرویس تولید عدد تصادفی استفاده میکند و عملیات اعتبارسنجی را انجام میدهد.
ویوهای لاگین و داشبورد:
ویوی لاگین شامل فرم ورود، فیلدهای یوزر، پسورد و عدد تصادفی است.
ویوی داشبورد پیام موفقیتآمیز بودن ورود را نمایش میدهد.
ویو صفحه اصلی:
لینک به صفحه لاگین در صفحه اصلی قرار داده شده است.
نتیجه نهایی:
با این تنظیمات، شما یک پروژه کامل با کنترلر AccountController، سرویس تولید عدد تصادفی و ویوهای مربوطه خواهید داشت. این پروژه به کاربر اجازه میدهد تا با وارد کردن یوزر و پسورد و عدد تصادفی به درستی وارد داشبورد شود و در صورت اشتباه بودن پیامهای خطا نمایش داده شود.