eitaa logo
پروژه ASP.Net Core MVC (وب و سی شارپ)
121 دنبال‌کننده
168 عکس
38 ویدیو
376 فایل
❁﷽❁ آموزش 📖 برنامه نویسی ASP.Net Core MVC (وب و سی شارپ) Admin: @alialirezapanahi برنامه نویسی برنامه نویسی سی شارپ eitaa.com/sisharpapp برنامه نویسی وب eitaa.com/aspdatnet ویراستی virasty.com/alialirezapanahi آپارات aparat.com/alialirezapanahi
مشاهده در ایتا
دانلود
برای ذخیره عکس‌ها در ASP.NET Core می‌توانید از سرویس‌های فایل و کتابخانه‌هایی مانند IFormFile و HostingEnvironment استفاده کنید. در ادامه مراحل اصلی برای ذخیره عکس‌ها را توضیح می‌دهم: مراحل ذخیره عکس: دریافت فایل‌های آپلود شده: ابتدا فایل‌های آپلود شده را از فرم دریافت کنید. می‌توانید از IFormFile برای دسترسی به فایل‌های آپلود شده استفاده کنید. تعیین مسیر ذخیره‌سازی: مسیر ذخیره‌سازی فایل‌ها را تعیین کنید. از IHostingEnvironment یا IWebHostEnvironment برای دسترسی به مسیرهای سیستم فایل استفاده کنید. ذخیره‌سازی فایل‌ها: فایل‌ها را به مسیر تعیین شده کپی کنید. می‌توانید از متدهای CopyTo یا CopyToAsync برای این منظور استفاده کنید. کد نمونه: پیکربندی کنترلر: csharp public class ProductsController : Controller { private readonly IWebHostEnvironment _webHostEnvironment; public ProductsController(IWebHostEnvironment webHostEnvironment) { _webHostEnvironment = webHostEnvironment; } [HttpPost] public async Task<IActionResult> AddNewProduct(RequestAddNewProductDto request, List<IFormFile> images) { if (images != null && images.Count > 0) { var imageDirectory = Path.Combine(_webHostEnvironment.WebRootPath, "images"); if (!Directory.Exists(imageDirectory)) { Directory.CreateDirectory(imageDirectory); } foreach (var image in images) { var fileName = Path.GetFileName(image.FileName); var filePath = Path.Combine(imageDirectory, fileName); using (var stream = new FileStream(filePath, FileMode.Create)) { await image.CopyToAsync(stream); } request.Images.Add(new ProductImageDto { Src = $"/images/{fileName}" }); } } // سایر عملیات مربوط به اضافه کردن محصول return View(); } } ویو برای آپلود فایل‌ها: html <form asp-action="AddNewProduct" enctype="multipart/form-data" method="post"> <!-- سایر فیلدهای فرم --> <div class="form-group"> <label for="Images">تصاویر محصول</label> <input type="file" id="Images" name="images" multiple class="form-control" accept="image/*"> </div> <button type="submit" class="btn btn-primary">افزودن محصول</button> </form> توضیحات: در کنترلر، از IWebHostEnvironment برای دسترسی به مسیر ریشه وب استفاده شده است. در متد AddNewProduct، اگر فایل‌هایی آپلود شده باشند، ابتدا مسیر ذخیره‌سازی فایل‌ها بررسی و در صورت لزوم ایجاد می‌شود. سپس فایل‌ها به مسیر تعیین شده کپی می‌شوند و مسیر نسبی فایل‌ها در لیست Images اضافه می‌شود. در ویو، فرم شامل فیلدهای مورد نیاز برای آپلود فایل‌ها است و خصوصیت enctype="multipart/form-data" برای آپلود فایل‌ها تنظیم شده است. با استفاده از این روش، می‌توانید تصاویر محصول را در سرور ذخیره و مسیرهای نسبی آن‌ها را ذخیره کنید تا در آینده به آن‌ها دسترسی داشته باشید.
کتابخانه LazZiya.TagHelpers یک مجموعه از TagHelpers مفید برای هر پروژه ASP.NET Core است. این کتابخانه شامل TagHelpers مختلفی برای کنترل‌های صفحه‌نمایش، تنظیمات محلی، و اضافه کردن کنترل‌های متنوع مانند Paging، Select-Enum، و Language Navigation است. برخی از TagHelpers مهم: Paging TagHelper: برای ایجاد کنترل‌های صفحه‌بندی با استفاده از Bootstrap 4. Alert TagHelper: برای ایجاد هشدارهای Bootstrap با استفاده از HTML ساده. Language Navigation TagHelper: برای ایجاد منوی گزینش زبان با استفاده از فلگ‌های زبان. Localization Validation Scripts TagHelper: برای اضافه کردن اسکریپت‌های محلی برای اعتبارسنجی ورودی‌های محلی مانند اعداد کسری، تاریخ‌ها و غیره.
برای اضافه کردن این مجموعه‌ها به DataBaseContext خود، باید کلاس DbContext خود را ویرایش کنید. این کلاس به عنوان نمایی از دیتابیس شما عمل می‌کند و شامل DbSet هایی است که نمایانگر جداول دیتابیس هستند. مراحل: باز کردن کلاس DataContext (یا هر نامی که برای کلاس DbContext خود انتخاب کرده‌اید): csharp public class DataBaseContext : DbContext, IDataBaseContext { public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options) { } public DbSet<Product> Products { get; set; } public DbSet<ProductImages> ProductImages { get; set; } public DbSet<ProductFeatures> ProductFeatures { get; set; } } اطمینان از وجود تنظیمات در فایل Startup.cs: در فایل Startup.cs مطمئن شوید که DbContext شما به درستی تنظیم شده است: csharp public void ConfigureServices(IServiceCollection services) { services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))); // سایر تنظیمات } ایجاد یا بروزرسانی Migrationها: برای اعمال تغییرات در دیتابیس، باید Migration ایجاد کنید و دیتابیس خود را به‌روزرسانی کنید. دستور زیر را در کنسول Package Manager اجرا کنید: bash Add-Migration AddProductEntities Update-Database توضیحات: DbSet<Product> Products: این خط کد یک جدول برای نگهداری اطلاعات محصولات ایجاد می‌کند. DbSet<ProductImages> ProductImages: این خط کد یک جدول برای نگهداری تصاویر محصولات ایجاد می‌کند. DbSet<ProductFeatures> ProductFeatures: این خط کد یک جدول برای نگهداری ویژگی‌های محصولات ایجاد می‌کند. فایل ApplicationDbContext (یا هر نامی که برای کلاس DbContext خود انتخاب کرده‌اید) باید شامل تمام DbSet هایی باشد که نمایانگر جداول دیتابیس شما هستند. با این مراحل، شما توانسته‌اید مجموعه‌های Products، ProductImages و ProductFeatures را به DataBaseContext خود اضافه کنید و آن‌ها را در دیتابیس خود ایجاد کنید.
بیایید کد ProductsController را که برای نمایش لیست محصولات و جزئیات هر محصول استفاده می‌شود بررسی کنیم. توضیحات کد: تعریف کلاس: csharp public class ProductsController : Controller { private readonly IProductFacad _productFacad; public ProductsController(IProductFacad productFacad) { _productFacad = productFacad; } } کلاس ProductsController از کلاس پایه Controller ارث‌بری می‌کند. یک فیلد خصوصی _productFacad از نوع IProductFacad تعریف شده است. سازنده کلاس ProductsController فیلد _productFacad را با استفاده از تزریق وابستگی مقداردهی اولیه می‌کند. متد Index: csharp public IActionResult Index(int page = 1) { return View(_productFacad.GetProductForSiteService.Execute(page).Data); } این متد برای نمایش لیست محصولات استفاده می‌شود. پارامتر page شماره صفحه فعلی را مشخص می‌کند و مقدار پیش‌فرض آن ۱ است. از سرویس GetProductForSiteService برای دریافت لیست محصولات صفحه‌بندی شده استفاده می‌کند. داده‌های دریافت شده را به ویو ارسال می‌کند. متد Detail: csharp public IActionResult Detail(long Id) { return View(_productFacad.GetProductDetailForSiteService.Execute(Id).Data); } این متد برای نمایش جزئیات یک محصول خاص استفاده می‌شود. پارامتر Id شناسه محصول را مشخص می‌کند. از سرویس GetProductDetailForSiteService برای دریافت جزئیات محصول استفاده می‌کند. داده‌های دریافت شده را به ویو ارسال می‌کند. نتیجه‌گیری: کنترلر ProductsController به شما امکان می‌دهد تا لیست محصولات و جزئیات هر محصول را در سایت خود نمایش دهید. شامل دو متد Index برای نمایش لیست محصولات به صورت صفحه‌بندی شده و Detail برای نمایش جزئیات یک محصول خاص است. این متدها از سرویس‌های مختلف ProductFacad برای دریافت داده‌های مورد نیاز استفاده می‌کنند و آن‌ها را به ویو مربوطه ارسال می‌کنند.
بیایید کد ویوی نمایش لیست محصولات را که برای نمایش آرشیو محصولات در سایت استفاده می‌شود بررسی کنیم. توضیحات کد: اضافه کردن فضای نام‌ها و مدل: csharp @using Test_Store.Application.Services.Products.Queries.GetProductForSite; @model ResultProductForSiteDto; @using برای استفاده از فضای نام سرویس‌های مورد نیاز برای دریافت لیست محصولات. @model برای تعریف مدل داده‌ای که به ویو ارسال می‌شود. در اینجا مدل ResultProductForSiteDto است که شامل لیست محصولات و سایر اطلاعات مربوط به صفحه‌بندی است. ViewData و Layout: csharp @{ ViewData["Title"] = "Index"; Layout = "~/Views/Shared/_Layout.cshtml"; } ViewData["Title"]: عنوان صفحه را به "Index" تنظیم می‌کند. Layout: از Layout مشخص شده برای این صفحه استفاده می‌کند. ساختار اصلی HTML: بخش‌های مختلف صفحه شامل هدر، بدنه، و نمایش لیست محصولات. نمایش آرشیو محصولات: html <div class="col-lg-12 col-md-12 col-xs-12 pl"> <div class="shop-archive-content mt-3 d-block"> <div class="archive-header"> <h2 class="archive-header-title">آرشیو محصولات</h2> <div class="sort-tabs mt-0 d-inline-block pr"> <h4>مرتب‌سازی بر اساس :</h4> </div> <div class="nav-sort-tabs-res"> <ul class="nav sort-tabs-options" id="myTab" role="tablist"> <li class="nav-item"> <a class="nav-link active" id="Most-visited-tab" data-toggle="tab" href="-visited" role="tab" aria-controls="Most-visited" aria-selected="true">پربازدیدترین</a> </li> <li class="nav-item"> <a class="nav-link" id="Bestselling-tab" data-toggle="tab" href="" role="tab" aria-controls="Bestselling" aria-selected="false">پرفروش‌ترین‌</a> </li> <li class="nav-item"> <a class="nav-link" id="Most-Popular-tab" data-toggle="tab" href="-Popular" role="tab" aria-controls="Most-Popular" aria-selected="false">محبوب‌ترین</a> </li> <li class="nav-item"> <a class="nav-link" id="newest-tab" data-toggle="tab" href="" role="tab" aria-controls="newest" aria-selected="false">جدیدترین</a> </li> <li class="nav-item"> <a class="nav-link" id="cheapest-tab" data-toggle="tab" href="" role="tab" aria-controls="cheapest" aria-selected="false">ارزان‌ترین</a> </li> <li class="nav-item"> <a class="nav-link" id="most-expensive-tab" data-toggle="tab" href="-expensive" role="tab" aria-controls="most-expensive" aria-selected="false">گران‌ترین</a> </li> </ul> </div> </div> <div class="product-items"> <div class="tab-content" id="myTabContent"> @foreach (var item in Model.Products) { <div class="tab-pane fade show active" id="Most-visited" role="tabpanel" aria-labelledby="Most-visited-tab"> <div class="row"> <div class="col-lg-3 col-md-3 col-xs-12 order-1 d-block mb-3"> <section class="product-box product product-type-simple"> <div class="thumb"> <a href="~/products/detail/@item.Id" class="d-block"> <div class="product-rate"> @for (int i = 1; i <= item.Star; i++) { <i class="fa fa-star active"></i> } @for (int i = 1; i <= (5 - item.Star); i++) { <i class="fa fa-star"></i>
} </div> <img src="~/@item.ImageSrc"> </a> </div> <div class="title"> <a href="~/products/detail/@item.Id">@item.Title</a> </div> <div class="price"> <span class="amount"> @item.Price.ToString("n0") <span>تومان</span> </span> </div> </section> </div> </div> </div> } </div> </div> <div class="pagination-product"> <nav aria-label="Page navigation example"> <ul class="pagination"> <li class="page-item"> <a class="page-link" href="#" aria-label="Previous"> <span aria-hidden="true">«</span> </a> </li> <li class="page-item"> <a class="page-link active" href="#">1</a> </li> <li class="page-item"> <a class="page-link" href="#">2</a> </li> <li class="page-item"> <a class="page-link" href="#">3</a> </li> <li class="page-item"> <a class="page-link" href="#" aria-label="Next"> <span aria-hidden="true">»</span> </a> </li> </ul> </nav> </div> </div> </div> هدر صفحه: شامل عنوان صفحه و تب‌های مرتب‌سازی براساس معیارهای مختلف (پربازدیدترین، پرفروش‌ترین، محبوب‌ترین، جدیدترین، ارزان‌ترین، گران‌ترین). نمایش محصولات: از foreach برای پیمایش مدل (لیست محصولات) و نمایش اطلاعات هر محصول استفاده شده است. هر محصول شامل تصویر، عنوان، نرخ‌بندی (ستاره‌ها)، و قیمت است. تب‌های مرتب‌سازی براساس معیارهای مختلف استفاده شده‌اند تا کاربران بتوانند محصولات را بر اساس معیارهای مختلف مشاهده کنند. صفحه‌بندی (Pagination): از عناصر HTML و CSS برای نمایش ناوبری صفحات استفاده شده است. به کاربران این امکان را می‌دهد تا بین صفحات مختلف محصولات جابجا شوند. نتیجه‌گیری: این کد به شما امکان می‌دهد تا لیست محصولات را به صورت آرشیوی و با قابلیت مرتب‌سازی بر اساس معیارهای مختلف نمایش دهید. شامل تب‌های مرتب‌سازی، نمایش محصولات به همراه تصویر و اطلاعات مرتبط، و ناوبری صفحات است. این طراحی به کاربران کمک می‌کند تا به راحتی محصولات مورد نظر خود را بیابند و مشاهده کنند.
بیایید این کد را که برای نمایش جزئیات یک محصول خاص در سایت استفاده می‌شود بررسی کنیم. توضیحات کد: اضافه کردن فضای نام‌ها و مدل: csharp @using Test_Store.Application.Services.Products.Queries.GetProductDetailForSite; @model ProductDetailForSiteDto; @using برای استفاده از فضای نام سرویس‌های مورد نیاز برای دریافت جزئیات محصول. @model برای تعریف مدل داده‌ای که به ویو ارسال می‌شود. در اینجا مدل ProductDetailForSiteDto است که شامل جزئیات محصول است. ViewData و Layout: csharp @{ ViewData["Title"] = "Detail"; Layout = "~/Views/Shared/_Layout.cshtml"; } ViewData["Title"]: عنوان صفحه را به "Detail" تنظیم می‌کند. Layout: از Layout مشخص شده برای این صفحه استفاده می‌کند. ساختار اصلی HTML: بخش‌های مختلف صفحه شامل مدال، گالری تصاویر، عنوان محصول، ویژگی‌ها، نقد و بررسی، و مشخصات فنی. نمایش تصاویر محصول در مدال (Modal): html <div class="modal fade" id="more-product" tabindex="-1" role="dialog" aria-labelledby="exampleModalCenterTitle" aria-hidden="true"> <div class="modal-dialog modal-dialog-centered more-product" role="document"> <div class="modal-content"> <div class="modal-body"> <div id="custom-events"> @foreach (var item in Model.Images) { <a href="~/@item"> <img src="~/@item" /> </a> } </div> </div> </div> </div> </div> این بخش شامل یک مدال (Modal) است که تصاویر محصول را نمایش می‌دهد. از @foreach برای پیمایش مدل (لیست تصاویر) و نمایش هر تصویر استفاده شده است. گالری تصاویر محصول: html <div class="gallery-item"> <div class="gallery-img"> <a href="#"> <img class="zoom-img" id="img-product-zoom" src="~/@Model.Images.FirstOrDefault()" data-zoom-image="/@Model.Images.FirstOrDefault()" width="411" /> <div id="gallery_01f" style="width:420px;float:right;"> </a> <ul class="gallery-items owl-carousel owl-theme" id="gallery-slider"> @foreach (var item in Model.Images) { <li class="item"> <a href="#" class="elevatezoom-gallery active" data-update="" data-image="/@item" data-zoom-image="/@item"> <img src="~/@item" width="100" /> </a> </li> } </ul> </div> </div> این بخش شامل گالری تصاویر محصول است که از owl-carousel برای نمایش تصاویر به صورت اسلایدری استفاده می‌شود. تصویر اصلی با قابلیت زوم و تصاویر کوچک در پایین آن نمایش داده می‌شوند. عنوان و مشخصات کلی محصول: html <div class="product-headline"> <h1 class="product-title"> @Model.Title </h1> <div class="product-guaranteed text-success"> 12 <span>فروش موفق</span> </div> </div> این بخش شامل عنوان محصول و تعداد فروش موفق آن است. ویژگی‌های محصول: html <div class="product-params pt-3"> <ul data-title="ویژگی‌های محصول"> @foreach (var item in Model.Features.Take(5)) { <li> <span>@item.DisplayName: </span> <span>@item.Value</span> </li> } </ul> </div> این بخش شامل لیستی از ویژگی‌های محصول است که فقط پنج ویژگی اول نمایش داده می‌شوند. نقد و بررسی اجمالی محصول: html <h2 class="params-headline">نقد و بررسی اجمالی</h2> <section class="content-expert-summary"> <div class="mask pm-3"> <div class="mask-text"> @Model.Description </div> <a href="#" class="mask-handler"> <span class="show-more">+ ادامه مطلب</span> <span class="show-less">- بستن</span> </a> <div class="shadow-box"></div> </div> </section> این بخش شامل نقد و بررسی اجمالی محصول است که در صورت طولانی بودن متن، قابلیت نمایش ادامه متن با کلیک روی لینک "ادامه مطلب" فراهم می‌شود. مشخصات فنی محصول:
html <article> <h2 class="params-headline"> مشخصات فنی <span>Samsung Galaxy Note 10 Dual SIM 256GB Mobile Phone</span> </h2> <section> <ul class="params-list"> @foreach (var item in Model.Features) { <li class="params-list-item"> <div class="params-list-key"> <span class="block"> @item.DisplayName </span> </div> <div class="params-list-value"> <span class="block"> @item.Value </span> </div> </li> } </ul> </section> </article> این بخش شامل لیست کامل ویژگی‌های فنی محصول است. بخش اسکریپت‌ها: csharp @section Scripts { <script src="~/SiteTemplate/assets/js/vendor/lightgallery-all.js"></script> <script src="~/SiteTemplate/assets/js/vendor/jquery.ez-plus.js"></script> } این بخش شامل لینک اسکریپت‌های لازم برای نمایش گالری تصاویر و قابلیت زوم تصاویر است. نتیجه‌گیری: این کد به شما امکان می‌دهد تا جزئیات کامل یک محصول را به همراه تصاویر، ویژگی‌ها، نقد و بررسی، و مشخصات فنی در سایت خود نمایش دهید. شامل مدال برای نمایش تصاویر، گالری تصاویر محصول، عنوان و مشخصات کلی، ویژگی‌ها، نقد و بررسی اجمالی، و مشخصات فنی محصول است. این طراحی به کاربران کمک می‌کند تا به راحتی به اطلاعات کامل و دقیقی از محصول دسترسی داشته باشند.
بیایید کد این سرویس را که برای دریافت لیست محصولات جهت نمایش در سایت استفاده می‌شود بررسی کنیم. توضیحات کد: تعریف اینترفیس IGetProductForSiteService: csharp public interface IGetProductForSiteService { ResultDto<ResultProductForSiteDto> Execute(int Page); } این اینترفیس یک متد Execute تعریف می‌کند که یک پارامتر Page دریافت می‌کند و یک ResultDto<ResultProductForSiteDto> را بازمی‌گرداند. کلاس GetProductForSiteService: فیلدهای خصوصی و سازنده: csharp public class GetProductForSiteService : IGetProductForSiteService { private readonly IDataBaseContext _context; public GetProductForSiteService(IDataBaseContext context) { _context = context; } } این کلاس شامل یک فیلد خصوصی _context از نوع IDataBaseContext و یک سازنده است که این فیلد را مقداردهی اولیه می‌کند. متد Execute: csharp public ResultDto<ResultProductForSiteDto> Execute(int Page) { int totalRow = 0; var products = _context.Products .Include(p => p.ProductImages) .ToPaged(Page, 5, out totalRow); Random rd = new Random(); return new ResultDto<ResultProductForSiteDto> { Data = new ResultProductForSiteDto { TotalRow = totalRow, Products = products.Select(p => new ProductForSiteDto { Id = p.Id, Star = rd.Next(1, 5), Title = p.Name, ImageSrc = p.ProductImages.FirstOrDefault().Src, Price = p.Price }).ToList(), }, IsSuccess = true, }; } این متد لیست محصولات را از دیتابیس دریافت می‌کند و سپس آن‌ها را به صورت صفحه‌بندی شده (paging) بازمی‌گرداند. از Include برای بارگذاری اطلاعات مرتبط (تصاویر محصول) استفاده می‌شود. متد ToPaged برای انجام عملیات صفحه‌بندی استفاده می‌شود و totalRow تعداد کل رکوردها را محاسبه می‌کند. از کلاس Random برای ایجاد یک عدد تصادفی بین ۱ تا ۵ برای ستاره‌های محصول استفاده می‌شود. نتیجه به عنوان یک ResultDto<ResultProductForSiteDto> شامل محصولات صفحه‌بندی شده و تعداد کل رکوردها بازگردانده می‌شود. کلاس ResultProductForSiteDto: csharp public class ResultProductForSiteDto { public List<ProductForSiteDto> Products { get; set; } public int TotalRow { get; set; } } این کلاس شامل جزئیات مربوط به صفحه‌بندی مانند تعداد کل رکوردها و لیست محصولات است. کلاس ProductForSiteDto: csharp public class ProductForSiteDto { public long Id { get; set; } public string Title { get; set; } public string ImageSrc { get; set; } public int Star { get; set; } public int Price { get; set; } } این کلاس شامل اطلاعات محصول مانند شناسه، نام، مسیر تصویر، تعداد ستاره‌ها و قیمت است. نتیجه‌گیری: این کد به شما امکان می‌دهد تا لیست محصولات را به صورت صفحه‌بندی شده برای نمایش در سایت دریافت کنید. از اینترفیس IGetProductForSiteService برای تعریف قرارداد و از کلاس GetProductForSiteService برای پیاده‌سازی این قرارداد استفاده می‌شود. اطلاعات محصولات شامل جزئیات صفحه‌بندی و محصولات بازگردانده شده است که به کاربران سایت کمک می‌کند تا به راحتی محصولات را مشاهده کنند.
بیایید کد سرویس GetProductDetailForSiteService و اینترفیس IGetProductDetailForSiteService را که برای دریافت جزئیات محصول جهت نمایش در سایت استفاده می‌شود بررسی کنیم. توضیحات کد: تعریف اینترفیس IGetProductDetailForSiteService: csharp public interface IGetProductDetailForSiteService { ResultDto<ProductDetailForSiteDto> Execute(long Id); } این اینترفیس یک متد Execute تعریف می‌کند که یک پارامتر Id دریافت می‌کند و یک ResultDto<ProductDetailForSiteDto> را بازمی‌گرداند. کلاس GetProductDetailForSiteService: فیلدهای خصوصی و سازنده: csharp public class GetProductDetailForSiteService : IGetProductDetailForSiteService { private readonly IDataBaseContext _context; public GetProductDetailForSiteService(IDataBaseContext context) { _context = context; } } این کلاس شامل یک فیلد خصوصی _context از نوع IDataBaseContext و یک سازنده است که این فیلد را مقداردهی اولیه می‌کند. متد Execute: csharp public ResultDto<ProductDetailForSiteDto> Execute(long Id) { var Product = _context.Products .Include(p => p.Category) .ThenInclude(p => p.ParentCategory) .Include(p => p.ProductImages) .Include(p => p.ProductFeatures) .Where(p => p.Id == Id).FirstOrDefault(); if (Product == null) { throw new Exception("Product Not Found....."); } return new ResultDto<ProductDetailForSiteDto>() { Data = new ProductDetailForSiteDto { Brand = Product.Brand, Category = $"{Product.Category.ParentCategory.Name} - {Product.Category.Name}", Description = Product.Description, Id = Product.Id, Price = Product.Price, Title = Product.Name, Images = Product.ProductImages.Select(p => p.Src).ToList(), Features = Product.ProductFeatures.Select(p => new ProductDetailForSite_FeaturesDto { DisplayName = p.DisplayName, Value = p.Value, }).ToList(), }, IsSuccess = true, }; } این متد اطلاعات محصول را با استفاده از شناسه محصول Id از دیتابیس دریافت می‌کند. از Include و ThenInclude برای بارگذاری اطلاعات مرتبط استفاده می‌شود (مثلاً دسته‌بندی‌ها، ویژگی‌های محصول، تصاویر محصول). اگر محصول مورد نظر پیدا نشود، یک استثناء (Exception) پرتاب می‌شود. نتیجه به عنوان یک ResultDto<ProductDetailForSiteDto> شامل جزئیات محصول بازگردانده می‌شود. کلاس ProductDetailForSiteDto: csharp public class ProductDetailForSiteDto { public long Id { get; set; } public string Title { get; set; } public string Brand { get; set; } public string Category { get; set; } public string Description { get; set; } public int Price { get; set; } public List<string> Images { get; set; } public List<ProductDetailForSite_FeaturesDto> Features { get; set; } } این کلاس شامل جزئیات محصول مانند شناسه، نام، برند، دسته‌بندی، توضیحات، قیمت، تصاویر و ویژگی‌های محصول است. کلاس ProductDetailForSite_FeaturesDto: csharp public class ProductDetailForSite_FeaturesDto { public string DisplayName { get; set; } public string Value { get; set; } } این کلاس شامل اطلاعات ویژگی‌های محصول است که شامل نام نمایشی ویژگی و مقدار آن است. نتیجه‌گیری: این کد به شما امکان می‌دهد تا جزئیات کامل یک محصول را با استفاده از شناسه آن دریافت کنید. از اینترفیس IGetProductDetailForSiteService برای تعریف قرارداد و از کلاس GetProductDetailForSiteService برای پیاده‌سازی این قرارداد استفاده می‌شود. جزئیات محصول شامل ویژگی‌ها، تصاویر، دسته‌بندی، و سایر اطلاعات مرتبط است که به کاربران سایت کمک می‌کند تا اطلاعات کامل و دقیقی از محصولات داشته باشند.