Attribute [NonAction]
در Asp.Net Core MVC برای مشخص کردن متدهایی استفاده میشود که نباید به عنوان اکشن در کنترلر شناخته شوند. این کاربرد دارد زمانی که بخواهید متدی را در کنترلر داشته باشید که به عنوان اکشن عمومی برای درخواستهای HTTP موجود نباشد، اما همچنان در داخل کنترلر استفاده شود.
برای استفاده از [NonAction]، به سادگی آن را در بالای متد مورد نظر قرار دهید:
using Microsoft.AspNetCore.Mvc;
public class HomeController : Controller
{
[NonAction]
public void HelperMethod()
{
// منطق کمکی که نمیخواهید به عنوان اکشن عمومی باشد
}
public IActionResult Index()
{
// استفاده از متد HelperMethod درون یک اکشن
HelperMethod();
return View();
}
}
در این مثال، متد HelperMethod با Attribute [NonAction] علامتگذاری شده است، بنابراین به عنوان یک اکشن عمومی در دسترس نخواهد بود اما میتواند درون اکشنهای دیگر استفاده شود.
و Action Selectors در Asp.Net Core MVC، Attributeهایی هستند که تعیین میکنند یک اکشن کنترلر چگونه به درخواستهای HTTP پاسخ دهد. سه Attribute پرکاربرد در این دسته عبارتند از:
HttpGet:
برای درخواستهای GET استفاده میشود. مثلاً:
[HttpGet]
public IActionResult Index()
{
return View();
}
HttpPost:
برای درخواستهای POST استفاده میشود. مثلاً:
[HttpPost]
public IActionResult Create(Item item)
{
// منطق ایجاد آیتم جدید
return RedirectToAction("Index");
}
HttpPut:
برای درخواستهای PUT استفاده میشود. مثلاً:
[HttpPut]
public IActionResult Update(int id, Item item)
{
// منطق بهروز رسانی آیتم
return RedirectToAction("Index");
}
این Action Selectorها مشخص میکنند که هر اکشن کنترلر چگونه به درخواستهای مختلف پاسخ دهد، بنابراین میتوانید درخواستها را به طور دقیق مدیریت کنید و منطق مناسب برای هر نوع درخواست اعمال کنید.
برای نمایش خورجی از برنامه Postman کمک بگیرید
یک نرمافزار متنباز برای تست و توسعه APIها است
این نرمافزار به شما امکان میدهد تا درخواستهای HTTP را ارسال کنید، پاسخها را بررسی کنید و APIها را به راحتی اشکالیابی کنید
همچنین ابزارهایی برای طراحی، تست، مستندات و موکینگ APIها فراهم میکند
میتواند به صورت نرمافزار دسکتاپ یا از طریق وب استفاده شود
برای شروع، میتوانید آن را از وبسایت Postman دانلود کنید و نصب کنید
https://www.postman.com/downloads/
Attribute [ActionName]
به شما این امکان رو میده که نام یک اکشن رو تغییر بدید بدون اینکه نام خود متد تغییر کنه. این attribute زمانی مفیده که میخواهید یک متد رو با نامی متفاوت نسبت به نام اصلی اون متد در URL یا درخواست HTTP نمایش بدید.
مثال:
using Microsoft.AspNetCore.Mvc;
public class HomeController : Controller
{
// متدی با نام "Index" داریم اما با ActionName تغییر دادیم به "Home"
[ActionName("Home")]
public IActionResult Index()
{
return View();
}
}
در این مثال، متد Index با استفاده از Attribute ActionName به عنوان "Home" شناخته میشه. بنابراین، وقتی یک درخواست HTTP به HomeController با اکشن "Home" ارسال بشه، این متد اجرا میشه
اگر نام view و نام اکشنی که با Attribute ActionName تغییر دادهاید یکسان نباشند، ممکن است به خطای 404 برخورد کنید چون فریمورک MVC به دنبال view با نام جدید میگردد. برای حل این مشکل، میتوانید از نام جدید در مسیر ویو داخل پرانتز قرار دهید
مثال:
using Microsoft.AspNetCore.Mvc;
public class HomeController : Controller
{
[ActionName("Home")]
public IActionResult Index()
{
return View("Index"); // یا نام view مورد نظر
}
}
در این مثال، اگر نام view همان "Index" باشد، به طور صریح آن را در متد اکشن مشخص کردهایم.
در Asp.Net Core MVC، مدلها (Models) بخش مهمی از معماری MVC هستند که برای تعریف و مدیریت دادههای اپلیکیشن استفاده میشوند. مدلها مسئول ارتباط با پایگاه داده، اعتبارسنجی دادهها و منطق کسبوکار هستند.
مدلها معمولاً به صورت کلاسهای C# تعریف میشوند و میتوانند شامل خصوصیات و متدهایی باشند که دادهها را مدیریت میکنند.
در Asp.Net Core MVC، دو نوع مدل مختلف معمولاً استفاده میشود: مدلهای Entity و مدلهای Business (یا Domain).
مدلهای Entity:
این مدلها برای نمایش اشیاء پایگاه داده استفاده میشوند.
معمولاً توسط Entity Framework ایجاد و مدیریت میشوند.
به عنوان مثال، یک مدل Product که خصوصیات Id، Name و Price را دارد و مستقیماً با جدول پایگاه داده متناظر است.
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
}
در این مثال، مدل Product شامل سه خصوصیت است: Id، Name و Price. میتوانید از این مدلها در کنترلرها و ویوها برای نمایش، ویرایش و ذخیره دادهها استفاده کنید.
مدلهای Business (یا Domain):
این مدلها برای مدیریت منطق کسبوکار و نمایش دادههایی که مستقیماً به پایگاه داده مربوط نیستند، استفاده میشوند.
معمولاً شامل منطقهای پیچیدهتر و متدهایی برای اعمال قوانین کسبوکار هستند.
به عنوان مثال، یک مدل Order که شامل روشهایی برای محاسبه کل قیمت سفارش و مدیریت اقلام آن است.
public class Order
{
public int OrderId { get; set; }
public List<Product> Products { get; set; }
public decimal CalculateTotal()
{
return Products.Sum(p => p.Price);
}
}
مدلهای Entity بیشتر برای ارتباط با پایگاه داده و مدلهای Business برای اعمال منطق و قوانین کسبوکار استفاده میشوند. این تمایز کمک میکند تا کدهایتان مرتب و مدیریتپذیرتر باشند.
models
در معماری mvc به بیزینس لاجیک ها business logic و entity پروژه گفته می شود یعنی business logic و entity پروژه را در بخش model پیاده سازی می کنیم مثلا یک سایت خبری ایجاد کردم کنترلرNewsController در پروژه متوسط به بالا نمیام model و business logic را در همین پروژه یعنی Endpoint پیاده سازی کنیم این پروژه که ساختیم Endpoint هست یعنی لایه نمایش به کاربر ما باید پروژه را لایه بندی کیم بر اساس معماری معماری کلین (Clean Architecture) و معماری پیازی (Onion Architecture) لایه بندی کنیم
در پوشه models کلیک راست کرده و پوشه به نام entity اضافه کرده و کلاس news و یک کلاس به نام Comments می سازم
اگر مثلا سایت خبری در نظر بگیرید و خود خبر یک entity حساب می شود entity همون موجودیت هست
یک مثال عملی
کلاس news
هر news می تواند لیستی از کامنتها Comments داشته باشد
public class News
{
public long Id { get; set; }
public string Title { get; set; }
public string Text { get; set; }
public virtual List<Comments> Comments { get; set; }
}
کلاس Comments
هر Comment متعلق به یک خبر است پس باید news را معرفی کنم
public class Comments
{
public long Id { get; set; }
public string Text { get; set; }
public virtual News News { get; set; }
}
یک پوشه به نام Repository ایجاد کنم
کلاس NewsRepository
public class NewsRepository
{
// یک متغیر دارد فقط خواندنی و خصوصی یک لیستی از news ها
private readonly List<News> _news;
// یک متد سازنده
public NewsRepository()
{
_news = new List<News>();
//===
_news.Add(new News
{
Id = 1,
Text = "this is a text of news.....",
Title = "title of news...."
});
}
// در این قسمت business logic را تعریف می کنم که برود یک داده ای از مثلا دیتابیس من دریافت کند business logic اون عملکردی که از برنامه انتظار دارید برای شما انجام دهد و شما اون عملکرد را در کد شما پیاده سازی می کنید
public List<News> GetList()
{
return _news;
}
}
}
کنترلرNewsController
public class NewsController :Controller
{
private readonly NewsRepository _newsRepository;
public NewsController()
{
_newsRepository = new NewsRepository();
}
[HttpGet]
public JsonResult Index2()
{
return Json(_newsRepository.GetList()) ;
}
}
در خروجی لیست خبر را برگشت داد
یک نکته مهم: در خروجی خود entity را ارسال کردیم این یک مثال آموزشی بود برای اینکه model را درک کنید شما در پروژه های واقعی نباید entity به لایه view درز کند هیچ وقت نباید entity را به کاربر پاس دهید یا از کاربر دریافت کنید
در Asp.Net Core MVC، یک Endpoint نقطهای از اپلیکیشن شماست که به درخواستهای HTTP پاسخ میدهد. به طور کلی، میتوان آن را به عنوان مقصد نهایی یک درخواست HTTP تصور کرد که در نهایت توسط یک اکشن در یک کنترلر پردازش میشود.
به عبارت دیگر، هر اکشنی در یک کنترلر که به درخواستهای HTTP پاسخ میدهد، یک Endpoint به حساب میآید. برای مثال:
public class HomeController : Controller
{
public IActionResult Index()
{
return View();
}
}
در این مثال، Index یک اکشن در HomeController است که به عنوان یک Endpoint عمل میکند. هنگامی که یک درخواست HTTP به /Home/Index ارسال میشود، این اکشن پردازش و یک پاسخ ارسال میکند.
و Endpoints میتوانند برای عملیات CRUD، نمایش ویوها، مدیریت دادهها و هر عملیات دیگری استفاده شوند که در MVC پیادهسازی میکنید.
معماری کلین (Clean Architecture) و معماری پیازی (Onion Architecture) دو روش محبوب برای ساخت نرمافزارهای با ساختار منظم و قابلتوسعه هستند.
معماری کلین (Clean Architecture)
معماری کلین از اصول SOLID استفاده میکند و هدفش جدا کردن منطق کسبوکار از جزئیات زیرساخت است. لایهها به صورت حلقههایی قرار میگیرند که هر لایه تنها به لایههای داخلیتر دسترسی دارد. این لایهها معمولاً شامل موارد زیر میشوند:
Entities:
شامل مدلهای دامنه و منطقهای تجاری اصلی.
Use Cases:
شامل عملیات و قواعدی که برای کسبوکار ضروری هستند.
Interface Adapters:
شامل رابطهایی برای تبدیل دادهها بین لایههای مختلف.
Frameworks & Drivers:
شامل جزئیات فنی مثل پایگاه داده و APIها.
معماری پیازی (Onion Architecture)
معماری پیازی مشابه معماری کلین است ولی با تاکید بیشتر بر لایههای دامنه و استفاده از انژکشن وابستگی (Dependency Injection). لایهها به شکل زیر هستند:
Domain Layer:
شامل مدلهای دامنه و منطقهای تجاری.
Application Layer:
شامل سرویسها و مواردی که برای اجرای منطق کسبوکار استفاده میشوند.
Infrastructure Layer:
شامل جزئیات زیرساختی مثل دسترسی به دادهها.
Presentation Layer:
شامل رابط کاربری و APIها.
هر دو معماری به شما کمک میکنند تا کدهای تمیزتر، قابلتوسعهتر و با جداسازی مسئولیتهای بهتر بنویسید.
در Asp.Net Core MVC، JSON به عنوان یک فرمت اصلی برای انتقال دادهها بین سرور و کلاینت استفاده میشود. میتوان با استفاده از JSON دادهها را ارسال و دریافت کرد. به عنوان مثال، برای ارسال دادهها به صورت JSON از یک اکشن کنترلر میتوان از JsonResult استفاده کرد:
public class HomeController : Controller
{
public JsonResult GetProduct()
{
var product = new Product
{
Id = 1,
Name = "Laptop",
Price = 1000
};
return Json(product);
}
}
در این مثال، اکشن GetProduct یک شیء از نوع Product را به صورت JSON برمیگرداند. وقتی به این اکشن درخواست شود، پاسخ به صورت JSON خواهد بود.
همچنین میتوان درخواستهای JSON را در کنترلر دریافت کرد. برای مثال، برای دریافت دادهها از یک درخواست POST به صورت JSON:
[HttpPost]
public IActionResult ReceiveProduct([FromBody] Product product)
{
if (ModelState.IsValid)
{
// پردازش دادههای محصول
return Ok();
}
return BadRequest(ModelState);
}
در این مثال، دادههای JSON ارسال شده از سمت کلاینت به اکشن ReceiveProduct میرسد و به عنوان یک شیء از نوع Product استفاده میشود.
در این قسمت view توضیح می دهیم قبل از توضیح یک کنترلر جدید به نام Blog اضافه می کنم کنترلر من یک اکشن به نام index دارد با return view که به mvc می گم که به دنبال view با نام index بگرد الان پروژه را اجرا کنیم و خروجی را ببینیم پروژه را اجرا کنیم به ما خطا می دهد می گوید view به نام index پیدا نکردم mvc مسیر به دنبال دو پوشه Blog و فایل index و پوشه shared و فایل index می گردد و اگر پیدا نکند این خطا را نشان می دهد