eitaa logo
پروژه ASP.Net Core MVC (وب و سی شارپ)
120 دنبال‌کننده
168 عکس
38 ویدیو
377 فایل
❁﷽❁ آموزش 📖 برنامه نویسی ASP.Net Core MVC (وب و سی شارپ) Admin: @alialirezapanahi برنامه نویسی برنامه نویسی سی شارپ eitaa.com/sisharpapp برنامه نویسی وب eitaa.com/aspdatnet ویراستی virasty.com/alialirezapanahi آپارات aparat.com/alialirezapanahi
مشاهده در ایتا
دانلود
برای پیاده‌سازی این سناریو در ویوی
Index
، ما باید یک حلقه
for
ایجاد کنیم که ۴۰۵ دکمه تولید کند. هر دکمه باید به اکشن
HandleError
در کنترلر
Error
لینک شود و شماره مربوط به خود را ارسال نماید. در ادامه کد کامل ویو (View) و کنترلر (Controller) آورده شده است: ### ۱. کد کنترلر (ErrorController.cs) این کنترلر شامل اکشنی است که شماره را دریافت کرده و نام ویو را به صورت پویا انتخاب می‌کند. csharp using Microsoft.AspNetCore.Mvc; namespace MyProject.Controllers { public class ErrorController : Controller { // این اکشن نام ویو را بر اساس شماره ورودی برمی‌گرداند public IActionResult HandleError(int id) { // ساخت نام ویو (مثلاً اگر id=32 باشد، viewName می‌شود "Action32") string viewName = $"Action{id}"; // بررسی می‌کنیم که آیا فایل ویو وجود دارد یا خیر تا خطا ندهد var result = ViewEngine.FindView(ControllerContext, viewName, isMainPage: false); if (result.Success) { return View(viewName); } else { // اگر ویو وجود نداشت، به صفحه ۴۰۴ اصلی برگردان return View("Action404"); } } } } ### ۲. کد ویو (Index.cshtml) در این ویو، یک حلقه از ۱ تا ۴۰۵ اجرا می‌شود و برای هر عدد یک دکمه (Tag Anchor) ساخته می‌شود که به اکشن بالا لینک دارد. html @{ ViewData["Title"] = "صفحه اصلی"; } <div class="text-center"> <h1 class="display-4">لیست دکمه‌های اکشن</h1> <p>برای مشاهده هر ویو روی دکمه مربوطه کلیک کنید:</p> <div class="button-container"> @* حلقه برای تولید ۴۰۵ دکمه *@ @for (int i = 1; i <= 405; i++) { // استفاده از Tag Helper برای ساخت لینک به اکشن HandleError در کنترلر Error // مقدار i به عنوان پارامتر id ارسال می‌شود <a asp-controller="Error" asp-action="HandleError" asp-route-id="@i" class="btn btn-primary m-1"> اکشن @i </a> } </div> </div> ### نکات مهم: ۱. تعداد دکمه‌ها: همانطور که خواستید، حلقه تا ۴۰۵ ادامه دارد. ۲. لینک‌دهی: از
asp-controller="Error"
و
asp-action="HandleError"
استفاده شده است تا وقتی روی دکمه ۳۲ کلیک می‌شود، آدرس
/Error/HandleError?id=32
اجرا شود. ۳. نام‌گذاری ویوها: فرض بر این است که شما در پوشه
Views/Error
فایل‌هایی با نام‌های Action1.cshtml، Action2.cshtml و ... Action404.cshtml و Action405.cshtml را ایجاد کرده‌اید. اگر فایل Action32.cshtml وجود نداشته باشد، کنترلر به طور خودکار کاربر را به
Action404
هدایت می‌کند.
پروژه ASP.Net Core MVC (وب و سی شارپ)
بسیار عالی. در اینجا بدون نوشتن حتی یک خط کد، معماری و عملکرد پروژه را بررسی می‌کنیم و به طور مفهومی توضیح می‌دهم که LINQ دقیقاً در کجای این سیستم و چگونه کار می‌کند. ### ۱. معماری کلی پروژه (بدون دیتابیس) این پروژه به جای اینکه اطلاعات را در یک نرم‌افزار سنگین دیتابیس (مثل SQL Server) ذخیره کند، از حافظه رم کامپیوتر استفاده می‌کند. تصور کنید که ما یک تخته وایت‌برد (Whiteboard) در دفتر کار داریم. * مدل (Model): این قالبی است که ما برای هر کارت روی تخته تعریف کرده‌ایم (مثلاً: هر کارت باید عنوان، توضیحات و تاریخ داشته باشد). * ریپازیتوری (Repository): این شخصی است که مسئول مدیریت تخته وایت‌برد است. هیچ‌کس جز او حق ندارد روی تخته چیزی بنویسد یا پاک کند. کنترلر به او می‌گوید «لیست کارهای انجام شده را بده» و او با نگاه کردن به تخته، جواب را برمی‌گرداند. * کنترلر (Controller): این مثل مدیر پروژه است که دستور می‌دهد. وقتی شما در مرورگر دکمه‌ای را می‌زنید، کنترلر متوجه می‌شود و به ریپازیتوری دستور می‌دهد. * ویو (View): این فقط نمایشگر است. صفحه‌ای است که شما در مرورگر می‌بینید و نتایج کار ریپازیتوری روی آن چاپ می‌شود. --- ### ۲. نقش LINQ در این پروژه (توضیح مفهومی) در دنیای برنامه‌نویسی قدیمی، برای پیدا کردن یک اطلاعات خاص در یک لیست، باید یک «حلقه» (Loop) می‌نوشتیم. مثلاً: «از اولین آیتم شروع کن، یکی‌یکی چک کن تا به آیتم مورد نظر برسی». این کار زمان‌بر و خسته‌کننده است. LINQ (Language Integrated Query) زبانی است که به ما اجازه می‌دهد با لیست‌های داده دقیقاً مثل یک دیتابیس حرفه‌ای صحبت کنیم. ما به زبان فارسی (یا انگلیسی) سوال می‌پرسیم و جواب را می‌گیریم، بدون اینکه نگران جزئیات چرخش در بین داده‌ها باشیم. در اینجا دقیقاً LINQ در بخش‌های مختلف پروژه چه کاری انجام می‌دهد: #### الف) فیلتر کردن (Where) - جستجو و فیلتر وقتی شما در کادر جستجو تایپ می‌کنید (مثلاً کلمه «پروژه») و دکمه جستجو را می‌زنید: * بدون LINQ: برنامه باید تک‌تک کارت‌ها را برمی‌داشت و چک می‌کرد آیا کلمه «پروژه» داخلش هست یا نه. * با LINQ: ما به لیست می‌گوییم: «فقط آن کارت‌هایی را به من بده که در عنوانشان کلمه پروژه وجود دارد.» * LINQ بلافاصله یک زیرمجموعه جدید از کارت‌ها را جدا کرده و تحویل می‌دهد. این دقیقاً همان کاری است که در متدهای
Search
و
FilterByStatus
انجام شده است. #### ب) مرتب‌سازی (OrderBy) - اولویت‌بندی وقتی وارد صفحه اصلی می‌شوید، می‌خواهید جدیدترین کارها در بالای لیست باشند. * بدون LINQ: باید الگوریتم‌های پیچیده مرتب‌سازی (مثل حبابی یا سریع) پیاده‌سازی می‌شد. * با LINQ: ما به لیست می‌گوییم: «خودت را بر اساس تاریخ ایجاد، از جدید به قدیم مرتب کن.» * همچنین در بخش فیلتر وضعیت، به لیست گفتیم: «خودت را بر اساس اولویت (عدد کمتر یعنی مهم‌تر) مرتب کن.» LINQ این کار را در کسری از ثانیه انجام می‌دهد. #### ج) انتخاب خاص (Select) - نمایش ستون‌ها فرض کنید ما فقط می‌خواهیم یک لیست کشویی (Dropdown) از نام دانشجویان بسازیم و نیازی به نمره یا کد ملی نداریم. * با LINQ: ما به دیتابیس می‌گوییم: «از بین تمام این اطلاعات، فقط ستون نام و نام خانوادگی را بردار و بقیه را دور بریز.» این کار باعث سبک شدن برنامه و افزایش سرعت می‌شود. #### د) پیدا کردن یک مورد خاص (FirstOrDefault) - ویرایش و حذف وقتی روی دکمه «ویرایش» یک کارت خاص کلیک می‌کنید، سیستم باید فقط همان یک کارت را پیدا کند. * با LINQ: ما می‌گوییم: «در بین تمام کارت‌ها، دنبال کارتی بگرد که شناسه (ID) آن برابر با ۵ است. اولین موردی که پیدا کردی را به من بده.» * اگر چیزی پیدا نکرد، مقدار «تهی» (Null) برمی‌گرداند تا برنامه خطا ندهد. #### هـ) تجمیع و محاسبات (Max, Any, Count) - مدیریت هوشمند در بخش ایجاد کارت جدید، ما نمی‌خواهیم شناسه دو کارت یکسان شود. * با LINQ: ما می‌پرسیم: «آیا اصلاً کارتی در لیست وجود دارد؟» (
Any
). اگر جواب بله بود، می‌پرسیم: «بزرگترین شناسه (ID) موجود چند است؟» (
Max
). سپس یک عدد به آن اضافه می‌کنیم تا شناسه جدید ساخته شود. ### خلاصه در این پروژه حرفه‌ای، LINQ به عنوان موتور پردازش داده عمل می‌کند. هر جا که نیاز به تصمیم‌گیری درباره داده‌ها بود (چه کاری را نشان دهیم؟، کدام یکی مهم‌تر است؟، آیا این وجود دارد؟)، LINQ وارد عمل شده و با دستورات بسیار کوتاه و خوانا، کارهای پیچیده برنامه‌نویسی را انجام می‌دهد. این کار باعث می‌شود کد شما تمیز، سریع و قابل نگهداری باشد.
پروژه ASP.Net Core MVC (وب و سی شارپ)
این پروژه یک سیستم مدیریت فروش و مشتریان است که با استفاده از تکنولوژی‌های مدرن وب (ASP.NET Core) طراحی شده است. هدف اصلی این پروژه، ثبت اطلاعات مشتریان، مدیریت سفارشات آن‌ها و ارائه گزارش‌های تحلیلی از فروش است. در ادامه، معماری و عملکرد پروژه را بدون کد توضیح می‌دهم: ### ۱. معماری پروژه (Architecture) این پروژه از الگوی MVC (Model-View-Controller) پیروی می‌کند که وظایف را به سه بخش اصلی تقسیم می‌کند: * Model (مدل): نمایانگر داده‌ها هستند. در این پروژه ما دو مدل اصلی داریم: «مشتری» (شامل نام، شهر، ایمیل) و «سفارش» (شامل مبلغ، تاریخ، و شناسه مشتری). * View (ویو): صفحات وبی هستند که کاربر می‌بیند (فرم‌ها، جداول، دکمه‌ها). وظیفه ویو نمایش داده‌ها به کاربر و دریافت ورودی‌های اوست. * Controller (کنترلر): مدیر یا رابط بین کاربر و داده‌هاست. وقتی کاربر دکمه‌ای را می‌زند، کنترلر تصمیم می‌گیرد چه کاری انجام شود (مثلاً اطلاعات را بگیرد، اعتبارسنجی کند و به ریپوزیتوری بسپارد). ### ۲. لایه دسترسی به داده (Repository Pattern) به جای اینکه کنترلر مستقیماً با دیتابیس یا لیست داده‌ها کار کند، ما یک لایه میانی به نام Repository داریم. * وظیفه: این لایه مسئول تمام عملیات ذخیره‌سازی، بازیابی، ویرایش و حذف داده‌هاست. * مزیت: اگر بخواهید در آینده دیتابیس خود را از "حافظه رم" به "SQL Server" تغییر دهید، فقط کدهای این بخش را تغییر می‌دهید و نیاز به دست زدن به کنترلرها یا ویوها نیست. ### ۳. مدیریت داده‌ها (In-Memory Data) در این پروژه خاص، به جای استفاده از یک دیتابیس سنگین و پیچیده (مثل SQL)، از حافظه موقت (RAM) برای ذخیره داده‌ها استفاده شده است. * داده‌ها در لیست‌هایی نگهداری می‌شوند. * محدودیت: چون داده‌ها در رم هستند، اگر برنامه را ببندید یا کامپیوتر را ریستارت کنید، داده‌های جدید پاک می‌شوند و به حالت اولیه برمی‌گردند. این روش برای پروتوتایپ‌ها و یادگیری بسیار سریع و مناسب است. ### ۴. قابلیت‌های اصلی پروژه (CRUD) پروژه دارای چهار عملیات اصلی است که روی هر دو موجودیت (مشتری و سفارش) انجام می‌شود: 1. Create (ایجاد): افزودن مشتری جدید یا ثبت یک سفارش برای مشتری خاص. 2. Read (خواندن): نمایش لیست تمام مشتریان یا لیست تمام سفارشات. 3. Update (بروزرسانی): ویرایش اطلاعات مشتری (مثل تغییر نام یا شهر). 4. Delete (حذف): پاک کردن یک مشتری (که به صورت خودکار سفارشات او را هم پاک می‌کند تا داده‌ها خراب نشوند) یا حذف یک سفارش. ### ۵. استفاده از LINQ پیشرفته یکی از نقاط قوت این پروژه، استفاده از قابلیت‌های جستجوی پیشرفته LINQ است. به طور خاص در بخش گزارش‌گیری: * Join: ارتباط بین «سفارشات» و «مشتریان» برقرار می‌شود تا بتوانیم نام مشتری را کنار مبلغ سفارش ببینیم. * GroupBy: سفارشات بر اساس «شهر» مشتریان دسته‌بندی می‌شوند. * Select: اطلاعات تجمیعی مثل "مجموع فروش"، "تعداد سفارش" و "آخرین تاریخ خرید" برای هر شهر استخراج می‌شود. ### ۶. جریان کاری (Workflow) فرض کنید کاربر می‌خواهد یک سفارش ثبت کند: 1. کاربر از صفحه اصلی وارد بخش مشتریان می‌شود. 2. لیست مشتریان را می‌بیند و دکمه «ثبت سفارش» را برای یکی از آن‌ها می‌زند. 3. یک فرم باز می‌شود که مبلغ سفارش را می‌گیرد. 4. اطلاعات به کنترلر ارسال می‌شود. 5. کنترلر اطلاعات را به ریپوزیتوری می‌دهد. 6. ریپوزیتوری چک می‌کند آیا مشتری وجود دارد؟ اگر بله، سفارش را در لیست ذخیره می‌کند و یک شناسه (ID) جدید به آن اختصاص می‌دهد. 7. کاربر به صفحه لیست سفارشات هدایت می‌شود و سفارش جدید را در جدول می‌بیند. این پروژه یک نمونه کامل و استاندارد از پیاده‌سازی عملیات CRUD با استفاده از شی‌گرایی در سی‌شارپ است.
TextFileCrudProject.zip
حجم: 2.5M
ببخشید اگر پروژه در دیتابیس ذخیره کنم حجم پروژه بالای 5 مگابایت می شود
پروژه ASP.Net Core MVC (وب و سی شارپ)
ببخشید اگر پروژه در دیتابیس ذخیره کنم حجم پروژه بالای 5 مگابایت می شود
در اینجا توضیحات کامل و مرحله‌به‌مرحله درباره پروژه‌ای که کدهای آن را نوشتیم آورده شده است. این پروژه یک وب‌اپلیکیشن مدیریت محصولات است که به جای دیتابیس، اطلاعات را در یک فایل متنی ذخیره می‌کند. ### ۱. هدف پروژه هدف اصلی این پروژه، پیاده‌سازی عملیات CRUD (مخفف Create, Read, Update, Delete) بدون نیاز به نصب و پیکربندی دیتابیس‌های سنگین مثل SQL Server است. این روش برای پروژه‌های کوچک، تمرینی یا یادگیری مفید است. ### ۲. معماری پروژه (Architecture) این پروژه از الگوی MVC (Model-View-Controller) پیروی می‌کند و یک لایه سرویس (Service) برای مدیریت فایل دارد: * Model (مدل): کلاس
Product
که ساختار داده‌ها (شناسه، نام، قیمت) را تعریف می‌کند. * View (نما): صفحات HTML (Razor) که به کاربر نمایش داده می‌شوند (
Index
,
Create
,
Edit
). * Controller (کنترلر):
ProductController
که بین کاربر و منطق برنامه واسطه می‌شود. * Service/Repository (سرویس):
ProductRepository
که وظیفه خواندن و نوشتن در فایل متنی را بر عهده دارد. ### ۳. نحوه ذخیره‌سازی داده‌ها (Data Storage) داده‌ها در یک فایل با فرمت CSV (Comma Separated Values) ذخیره می‌شوند. این فرمت شبیه به یک جدول اکسل است که هر سطر آن یک رکورد و ستون‌ها با کاما (
,
) از هم جدا شده‌اند. محتوای فایل database.txt:
Id,Name,Price
1,کتاب,50000
2,خودکار,10000
* ردیف اول: هدرها (نام ستون‌ها). * ردیف‌های بعدی: داده‌های واقعی. ### ۴. عملکرد متدهای سرویس (Repository Logic) کلاس
ProductRepository
مغز متفکر سیستم فایل است: 1. GetAll (خواندن): * کل فایل را خط به خط می‌خواند (File.ReadAllLines). * خط اول (هدر) را نادیده می‌گیرد. * بقیه خطوط را با کاما جدا (
Split
) کرده و به آبجکت‌های
Product
تبدیل می‌کند. 2. Add (افزودن): * لیست فعلی را می‌خواند تا آخرین
Id
را پیدا کند. * یک
Id
جدید (آخرین + ۱) تولید می‌کند. * اطلاعات جدید را به انتهای فایل اضافه می‌کند (File.AppendAllText). 3. Update (ویرایش) و Delete (حذف): * از آنجا که ویرایش یک خط خاص در فایل متنی دشوار است، این متدها کل فایل را در حافظه می‌خوانند. * تغییرات لازم (ویرایش یا حذف آیتم از لیست) را در حافظه اعمال می‌کنند. * کل فایل روی دیسک را پاک کرده و لیست جدید را جایگزین می‌کنند (File.WriteAllLines). ### ۵. جریان اجرای برنامه (Workflow) الف) نمایش لیست (Index): 1. کاربر آدرس
/Product/Index
را می‌زند. 2. کنترلر متد
GetAll
سرویس را صدا می‌زند. 3. سرویس فایل را خوانده و لیست محصولات را برمی‌گرداند. 4. کنترلر لیست را به View می‌فرستد تا در جدول نمایش داده شود. ب) ثبت محصول جدید (Create): 1. کاربر فرم را پر کرده و دکمه ذخیره را می‌زند. 2. کنترلر اطلاعات را دریافت کرده و به متد
Add
سرویس می‌دهد. 3. سرویس یک خط جدید به فایل database.txt اضافه می‌کند. 4. کاربر به صفحه لیست هدایت می‌شود. ### ۶. نکات فنی و محدودیت‌ها * همزمانی (Concurrency): اگر دو کاربر همزمان سعی کنند محصولی را اضافه کنند، ممکن است یکی از درخواست‌ها با خطا مواجه شود (چون فایل قفل شده است). این روش برای ترافیک بالا مناسب نیست. * Type Safety: تبدیل متن (String) داخل فایل به عدد (int.Parse) نیاز به دقت دارد؛ اگر فایل دستکاری شود، برنامه ممکن است کرش کند. * مسیر فایل: فایل در پوشه
Data
(در کنار فایل اجرایی برنامه) ذخیره می‌شود. این پروژه یک نمونه عالی برای درک نحوه کارکرد سیستم‌های مدیریت فایل و پایه و اساس دیتابیس‌ها است.
TextFileShopProject.zip
حجم: 2.6M
فروشگاه حرفه ای به جای ذخیره در دیتابیس ذخیره در فایل text
RamDbLikeProject.zip
حجم: 2.5M
پروژه ای نوشتم که کنترلر نمیفهمد از دیتابیس می خواند یا فایل text شبیه ساز Db Context و EFCore ساختم
پروژه در مورد Session