### مثال ۳: برای نمودار (همون کد خودمون)
var chartData = products
.Where(p => p.IsActive)
.OrderByDescending(p => p.Price)
.Take(10)
.Select(p => new ChartData
{
Label = p.Name.Length > 15 ? p.Name.Substring(0, 15) + "..." : p.Name,
Value = p.Price,
Color = GetRandomColor()
})
.ToList();
---
## ۸. ⚡️ Select با شرط (Ternary Operator)
var productDisplay = products.Select(p => new { p.Name, PriceCategory = p.Price > 1000000 ? "گران" : p.Price > 500000 ? "متوسط" : "ارزان", StatusIcon = p.IsActive ? "✅" : "❌", StockStatus = p.Stock > 0 ? "موجود" : "ناموجود" }).ToList();--- ## ۹. 🎯 Select با چندین شرط
var productAnalysis = products.Select(p => new { p.Name, p.Price, // دستهبندی قیمت PriceRange = p.Price switch { > 1000000 => "گران", > 500000 => "متوسط", > 0 => "ارزان", _ => "رایگان" }, // وضعیت نمایشی DisplayStatus = p.IsActive ? $"<span class='badge bg-success'>{p.Name} فعال</span>" : $"<span class='badge bg-secondary'>{p.Name} غیرفعال</span>", // محاسبات FinalPrice = p.Price * (p.IsActive ? 1 : 0.8m) // تخفیف برای غیرفعالها }).ToList();--- ## ۱۰. 📊 خلاصه و مقایسه | سناریو | کد | خروجی | |--------|-----|--------| | فقط نامها |
Select(p => p.Name)|
["لپتاپ", "موبایل"]| | شیء جدید |
Select(p => new { p.Name, p.Price }) | [{ Name="لپتاپ", Price=15000 }] |
| با ایندکس | Select((p,i) => new { Row=i+1, p.Name }) | [{ Row=1, Name="لپتاپ" }] |
| محاسباتی | Select(p => p.Price * 0.9)|
[13500, 7200]| | شرطی |
Select(p => p.IsActive ? "فعال" : "غیرفعال")|
["فعال", "غیرفعال"]| --- ## ✅ نکات طلایی Select: 1. تعداد آیتمها عوض نمیشه (برخلاف Where) 2. نوع خروجی میتونه متفاوت باشه 3. برای تبدیل داده به فرمت دیگه عالیه 4. میتونی Propertyهای محاسباتی بسازی 5. در EF Core به SQL بهینه تبدیل میشه --- حالا Select برات واضح شد؟ 🚀
MyValidationShop.zip
حجم:
16.1M
پروژه اعتبار سنجی سمت سرور و کلاینت
MyPartialShop.zip
حجم:
16M
پروژه MyPartialShop یک فروشگاه اینترنتی ساده با ASP.NET Core MVC است که از Partial View برای افزایش قابلیت استفاده مجدد کد استفاده میکند.
## ✅ پروژه MyPartialShop - فروشگاه با Partial View
سلام! این یک پروژه آموزشی ASP.NET Core MVC هست که توش یاد میگیریم چطور با Partial View کار کنیم.
---
## 📋 خلاصه پروژه:
| عنوان | توضیح |
|-------|-------|
| نام پروژه | MyPartialShop |
| نوع پروژه | فروشگاه اینترنتی ساده |
| تکنولوژی | ASP.NET Core MVC 8 |
| دیتابیس | SQL Server (LocalDB) |
| ویژگی خاص | استفاده از Partial View برای فرم محصول |
---
## 🎯 هدف پروژه:
یاد بگیریم چطور:
1. ✅ Partial View بسازیم و استفاده کنیم
2. ✅ یک فرم رو هم برای ایجاد و هم برای ویرایش استفاده کنیم
3. ✅ CRUD کامل (ایجاد، خواندن، ویرایش، حذف) پیادهسازی کنیم
4. ✅ با Entity Framework Core کار کنیم
5. ✅ اعتبارسنجی سمت سرور و کلاینت داشته باشیم
---
## 📁 ساختار پروژه:
MyPartialShop/ │ ├── 📁 Models/ │ └── Product.cs // مدل محصول │ ├── 📁 Data/ │ └── ApplicationDbContext.cs // اتصال به دیتابیس │ ├── 📁 Controllers/ │ └── ProductController.cs // کنترلر محصولات │ ├── 📁 Views/ │ ├── 📁 Product/ │ │ ├── Index.cshtml // لیست محصولات │ │ ├── Create.cshtml // صفحه ایجاد │ │ ├── Edit.cshtml // صفحه ویرایش │ │ ├── Details.cshtml // جزئیات محصول │ │ └── _ProductForm.cshtml // ✅ Partial View فرم │ │ │ └── 📁 Shared/ │ └── _Alert.cshtml // ✅ Partial View پیغام │ └── 📁 wwwroot/ // فایلهای استاتیک--- ## 💡 Partial View چیست؟ Partial View مثل یک تکه کد جداشده است که میتونی چند جا ازش استفاده کنی. مثال: در این پروژه: -
_ProductForm.cshtmlهم در صفحه Create و هم در صفحه Edit استفاده میشه -
_Alert.cshtmlدر همه صفحات برای نمایش پیغام استفاده میشه --- ## 🔄 جریان کار برنامه: ### 1️⃣ صفحه اصلی (Index) - لیست همه محصولات رو نشون میده - دکمههای عملیات (جزئیات، ویرایش، حذف) داره - پیغامهای موفقیت رو با Partial View نشون میده ### 2️⃣ ایجاد محصول (Create) - فرم رو با Partial View نشون میده - بعد از ذخیره، به صفحه اصلی برمیگرده ### 3️⃣ ویرایش محصول (Edit) - همین فرم رو با دادههای پر شده نشون میده - Partial View خودش تشخیص میده در حالت ویرایش هست یا ایجاد ### 4️⃣ جزئیات محصول (Details) - اطلاعات کامل محصول رو نشون میده ### 5️⃣ حذف محصول (Delete) - با کلیک روی دکمه حذف، محصول پاک میشه --- ## 🎨 ویژگیهای ظاهری: - استفاده از Bootstrap 5 برای طراحی زیبا - آیکنهای سیستمی (🔍 ✏️ 🗑 ➕) - رنگبندی مناسب برای دکمهها - ریسپانسیو (مناسب برای موبایل و تبلت) --- ## 🛠 تکنولوژیهای استفاده شده: | تکنولوژی | کاربرد | |----------|--------| | ASP.NET Core MVC 8 | فریمورک اصلی | | Entity Framework Core | کار با دیتابیس | | SQL Server LocalDB | دیتابیس | | Bootstrap 5 | ظاهر و استایل | | jQuery Validation | اعتبارسنجی سمت کلاینت | | LINQ | کوئرینویسی | --- ## ✅ مزایای این پروژه: 1. کد تمیز - با استفاده از Partial View 2. قابلیت استفاده مجدد - فرم مشترک برای Create و Edit 3. آموزشی - مناسب برای مبتدیها 4. کامل - همه عملیات CRUD رو داره 5. حرفهای - با اعتبارسنجی و پیغامهای کاربرپسند --- ## 📝 نکات مهم برای یادگیری: ### 🔸 تشخیص حالت در Partial View:
@{
bool isEdit = Model.Id > 0; // اگه Id داشته باشه، یعنی در حال ویرایشیم
string formAction = isEdit ? "Edit" : "Create";
}
### 🔸 استفاده از TempData برای پیغام:
TempData["Success"] = "محصول با موفقیت ایجاد شد";### 🔸 اعتبارسنجی با Data Annotations:
[Required(ErrorMessage = "نام محصول الزامی است")] [Range(1000, 100000000)]--- ## 🚀 چطور اجرا کنیم؟ 1. پروژه رو با Visual Studio 2022 باز کن 2. در Package Manager Console دستورات رو بزن:
Add-Migration InitialCreate Update-Database3. F5 بزن و اجرا کن --- ## 📸 صفحات پروژه: ### صفحه اصلی (Index) - لیست همه محصولات - دکمه ایجاد محصول جدید - دکمههای عملیات روی هر محصول ### صفحه ایجاد (Create) - فرم ورود اطلاعات - دکمه ذخیره ### صفحه ویرایش (Edit) - فرم پر شده با اطلاعات فعلی - دکمه ذخیره تغییرات - منطقه خطر برای حذف ### صفحه جزئیات (Details) - نمایش کامل اطلاعات محصول --- ## 💡 چیزهایی که یاد میگیری: ✅ Partial View چیه و چطور استفاده میشه ✅ چطور یه فرم رو برای دو حالت مختلف استفاده کنیم ✅ کار با Entity Framework Core ✅ اعتبارسنجی سمت سرور و کلاینت ✅ نمایش پیغامهای کاربرپسند با TempData ✅ عملیات CRUD کامل ✅ طراحی با Bootstrap ---
## 🎁 کدهای اصلی پروژه:
### مدل Product:
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
public string Description { get; set; }
public bool IsActive { get; set; }
public DateTime CreatedAt { get; set; }
public DateTime? UpdatedAt { get; set; }
}
### Partial View فرم:
@model Product
@{
bool isEdit = Model.Id > 0;
}
<form asp-action="@(isEdit ? "Edit" : "Create")">
<!-- فیلدهای فرم -->
</form>
---
## ✅ نتیجه:
این پروژه یک نمونه عالی برای یادگیری ASP.NET Core MVC و Partial View هست.
با خیال راحت میتونی ازش برای یادگیری یا تدریس استفاده کنی.
موفق باشی! 🚀
پروژه ASP.Net Core MVC (وب و سی شارپ)
پروژه enum
## ✅ آموزش کامل Enum در پروژه MyEnumShop
---
## 📚 Enum چیست؟
Enum یا Enumerator یک نوع داده در سیشارپ است که مجموعهای از ثابتهای نامگذاری شده را تعریف میکند.
به زبان ساده: Enum راهی برای گروهبندی مقادیر مرتبط با نامهای معنادار است.
---
## 🎯 مثال ساده:
// بدون Enum string orderStatus = "pending"; // غلطنویسی: "pendin" یا "PENDING" // با Enum OrderStatus status = OrderStatus.Pending; // همیشه درست و مشخص--- ## 📋 دو Enum در پروژه MyEnumShop: ### ۱. OrderStatus.cs (برای وضعیت سفارش)
public enum OrderStatus
{
[Display(Name = "در انتظار تایید")]
Pending = 1,
[Display(Name = "تایید شده")]
Confirmed = 2,
[Display(Name = "در حال پردازش")]
Processing = 3,
[Display(Name = "ارسال شده")]
Shipped = 4,
[Display(Name = "تحویل شده")]
Delivered = 5,
[Display(Name = "لغو شده")]
Cancelled = 6,
[Display(Name = "عودت داده شده")]
Returned = 7
}
### ۲. OperationType.cs (برای نوع عملیات)
public enum OperationType
{
[Display(Name = "➕ ایجاد محصول جدید")]
Create = 1,
[Display(Name = "✏️ ویرایش محصول")]
Edit = 2,
[Display(Name = "🔍 مشاهده جزئیات")]
Details = 3,
[Display(Name = "🗑 حذف محصول")]
Delete = 4,
[Display(Name = "📋 نمایش لیست")]
List = 5,
[Display(Name = "📊 نمایش داشبورد")]
Dashboard = 6
}
---
## 🎨 مزایای استفاده از Enum:
### ۱. خوانایی کد
// بد if (product.Status == 2) { } // خوب if (product.Status == OrderStatus.Confirmed) { }### ۲. امنیت در مقابل خطا
// این خطا میده (عدد 8 تعریف نشده) OrderStatus invalid = (OrderStatus)8; // همیشه مقادیر معتبر OrderStatus valid = OrderStatus.Pending;### ۳. اتمام خودکار در IDE وقتی تایپ میکنی `OrderStatus.`، همه گزینهها رو نشون میده. ### ۴. قابلیت نمایش نام فارسی با
[Display(Name = "...")]میتونیم نام فارسی به هر مقدار بدیم. --- ## 🔧 متد کمکی برای نمایش نام فارسی:
public static string GetEnumDisplayName(Enum value)
{
return value.GetType()
.GetField(value.ToString())
?.GetCustomAttributes(typeof(DisplayAttribute), false)
.FirstOrDefault() is DisplayAttribute displayAttribute
? displayAttribute.Name
: value.ToString();
}
// استفاده
string statusName = GetEnumDisplayName(OrderStatus.Pending);
// خروجی: "در انتظار تایید"
---
## 📊 جایگاه Enum در پروژه:
### در Model (Product.cs):
public class Product
{
// ...
public OrderStatus Status { get; set; } = OrderStatus.Pending;
public OperationType? LastOperation { get; set; }
// ...
}
### در ViewModel (ProductViewModel.cs):
public class ProductViewModel
{
// ...
public OrderStatus Status { get; set; }
public string StatusDisplay { get; set; }
public string StatusBadge { get; set; }
// ...
}
### در سرویس (ProductService.cs):
public async Task<Dictionary<OrderStatus, int>> GetOrderStatusStatisticsAsync()
{
var products = await _context.Products.ToListAsync();
return products
.GroupBy(p => p.Status)
.ToDictionary(g => g.Key, g => g.Count());
}
### در کنترلر (ProductController.cs):
public async Task<IActionResult> Index(OrderStatus? statusFilter = null)
{
ViewBag.OrderStatusList = Enum.GetValues(typeof(OrderStatus))
.Cast<OrderStatus>()
.Select(s => new SelectListItem
{
Value = ((int)s).ToString(),
Text = GetEnumDisplayName(s)
}).ToList();
// ...
}
### در ویو (Index.cshtml):
<select name="statusFilter">
@foreach (var status in ViewBag.OrderStatusList)
{
<option value="@status.Value">@status.Text</option>
}
</select>
<!-- نمایش با badge رنگی -->
<span class="badge @item.StatusBadge">@item.StatusDisplay</span>
---
## 🎯 کاربردهای Enum در پروژه:
### ۱. فیلتر بر اساس وضعیت
// دریافت محصولات با وضعیت خاص
var pendingProducts = await _productService
.GetProductsByStatusAsync(OrderStatus.Pending);
### ۲. آمار وضعیتها
var stats = await _productService.GetOrderStatusStatisticsAsync(); // stats["Pending"] = 5, stats["Confirmed"] = 3, ...
پروژه ASP.Net Core MVC (وب و سی شارپ)
پروژه enum
### ۳. تغییر وضعیت با Dropdown
<select asp-for="Status" asp-items="Html.GetEnumSelectList<OrderStatus>()">### ۴. ثبت نوع عملیات product.LastOperation = OperationType.Edit; --- ## 📊 مقایسه Enum با روشهای دیگر: | ویژگی | Enum | const string | int | |-------|------|--------------|-----| | خوانایی | ✅ عالی | ✅ خوب | ❌ بد | | امنیت | ✅ بالا | ❌ خطای تایپی | ❌ مقادیر نامعتبر | | اتمام خودکار | ✅ دارد | ❌ ندارد | ❌ ندارد | | نام فارسی | ✅ دارد | ✅ دارد | ❌ ندارد | | ذخیره در دیتابیس | ✅ عدد | ❌ رشته | ✅ عدد | --- ## 💡 نکات پیشرفته: ### ۱. پرچمگذاری (Flags) برای ترکیب وضعیتها
[Flags]
public enum Permissions
{
Read = 1,
Write = 2,
Delete = 4,
All = Read | Write | Delete // 7
}
### ۲. تبدیل Enum به SelectListItem
var selectList = Enum.GetValues(typeof(OrderStatus)) .Cast<OrderStatus>() .Select(s => new SelectListItem { Value = ((int)s).ToString(), Text = s.GetDisplayName() });### ۳. اعتبارسنجی Enum در Model
[Required]
[EnumDataType(typeof(OrderStatus))]
public OrderStatus Status { get; set; }
---
## ✅ خلاصه:
| سوال | جواب |
|------|------|
| Enum چیست؟ | مجموعهای از ثابتهای نامگذاری شده |
| چرا استفاده میکنیم؟ | برای خوانایی و امنیت بیشتر کد |
| در پروژه چند Enum داریم؟ | ۲ تا: OrderStatus و OperationType |
| کاربرد اول؟ | وضعیت سفارش (در انتظار، تایید شده، ...) |
| کاربرد دوم؟ | نوع عملیات (ایجاد، ویرایش، حذف، ...) |
| چطور نام فارسی نشون میدیم؟ | با Display Attribute |
---
Enum یکی از قدرتمندترین ابزارهای سیشارپ برای نوشتن کد تمیز و خواناست! 🚀3.9M حجم رسانه بالاست
مشاهده در ایتا
نصب کتابخانه آفلاین به شرطی قبلاً نصب کرده بودی.
CookieApp.zip
حجم:
2.6M
این کد یک کنترلر (Controller) در فریمورک ASP.NET Core است که برای مدیریت کوکیها (Cookies) استفاده میشود. این پروژه عملیات اصلی ایجاد (CRUD) روی کوکیها را انجام میدهد. در ادامه جزئیات بخشهای مختلف کد را توضیح میدهم:
### ۱. ساختار کلی و دادهها
* فضای نام (Namespace): CookieApp.Controllers نشان میدهد که این کد مربوط به لایه کنترلر برنامه است.
* **لیست موقت (
_cookies):** از آنجا که کوکیها در مرورگر کاربر ذخیره میشوند و سرور دسترسی مستقیم به لیست تمام کوکیهای ذخیره شده ندارد (مگر آنهایی که با هر درخواست ارسال میشوند)، یک لیست استاتیک
_cookiesایجاد شده تا وضعیت کوکیها را در حافظه سرور نگه دارد و بتوانیم آنها را در View نمایش دهیم. (در برنامههای واقعی به جای لیست استاتیک باید از دیتابیس استفاده کرد). ### ۲. اکشن متدها (Action Methods) #### متد
Index(نمایش لیست) * این متد با متد
GetAllCookies()فراخوانی میشود. *
GetAllCookiesدو کار انجام میدهد: ۱. کوکیهای موجود در لیست حافظه (
_cookies) را بررسی میکند و مقدار واقعی آنها را از Request.Cookies میخواند. ۲. تمام کوکیهای ارسال شده توسط مرورگر را میخواند و اگر در لیست نباشند، به آنها اضافه میکند. * در نهایت لیست به View بازگردانده میشود. #### متدهای
Create(ایجاد کوکی) * نسخه GET: فقط یک View خالی برای فرم ایجاد برمیگرداند. * نسخه POST: اطلاعات فرم را دریافت میکند. * اعتبارسنجی: با استفاده از
IsValidNameو
IsValidValueچک میکند که نام و مقدار کوکی فقط شامل حروف انگلیسی و اعداد باشد. * تنظیمات: یک شیء
CookieOptionsساخته میشود که تاریخ انقضا، امنیت (Https) و سایر تنظیمات را مشخص میکند. * ذخیره: با استفاده از Response.Cookies.Append کوکی در مرورگر کاربر ایجاد میشود و همزمان در لیست
_cookiesثبت میشود. #### متدهای
Edit(ویرایش کوکی) * کوکیها به صورت مستقیم قابل ویرایش نیستند. بنابراین این متد ابتدا کوکی قدیمی را با Response.Cookies.Delete حذف میکند. * سپس یک کوکی جدید با همان نام اما مقادیر و تاریخ انقضای جدید ایجاد میکند. * اطلاعات در لیست
_cookiesنیز بهروزرسانی میشوند. #### متدهای
Delete(حذف کوکی) * کوکی مورد نظر را از لیست پیدا میکند. * با استفاده از Response.Cookies.Delete آن را از مرورگر حذف میکند. * همچنین از لیست حافظه سرور (
_cookies) نیز پاک میکند. #### متد
Details(مشاهده جزئیات) * اطلاعات یک کوکی خاص را نمایش میدهد. * علاوه بر اطلاعات ذخیره شده در لیست، مقدار واقعی فعلی کوکی را از Request.Cookies میخواند و در
ViewBagقرار میدهد تا کاربر ببیند آیا کوکی منقضی شده است یا خیر. ### ۳. نکات فنی و امنیتی * **
HttpOnly = true:** این تنظیم باعث میشود اسکریپتهای سمت کلاینت (JavaScript) نتوانند به محتوای کوکی دسترسی داشته باشند، که امنیت را در برابر حملات XSS افزایش میدهد. * **
Secure = Request.IsHttps:** اگر درخواست HTTPS باشد، کوکی فقط از طریق کانال امن منتقل میشود. * **
ValidateAntiForgeryToken:** از حملات CSRF (جعل درخواست بین سایتی) جلوگیری میکند. ### ۴. جمعبندی این کد یک رابط کاربری مدیریتی ساده برای کار با کوکیها فراهم میکند. اگرچه از لیست استاتیک استفاده شده که برای محیطهای Production (تولید) مناسب نیست (چون با ریستارت سرور پاک میشود و در سرورهای چند هستهای مشکلساز میشود)، اما برای یادگیری و تست نحوه کار با Response.Cookies و Request.Cookies بسیار مناسب است.