در 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 می گردد و اگر پیدا نکند این خطا را نشان می دهد
در قسمت اکشن کلیک راست کرده و add view را بزنید و Razor view را انتخاب کنید و در view Name نام view را بنویسید که به صورت پیشفرض که وقتی به اکشن کلیک کنید نام اکشن قرار داده می شود و Add را می زنیم می بینیم یک پوشه به نام Blog ایجاد کرد و فایل index.cshtml ایجاد کرد
اگر بتوانم در index Blog فایل index Home را نمایش بدهم در اینجا می توانم آدرس را کامل وارد کنم و پسوند فایل هم تایپ کرد
در Asp.Net Core MVC، Razor یک موتور نمایش (view engine) است که برای ترکیب کد C# با HTML استفاده میشود. Razor این امکان را فراهم میکند که کد سمت سرور را به صورت مختصر و خوانا داخل فایلهای HTML بنویسید. فایلهای Razor معمولاً با پسوند .cshtml ذخیره میشوند.
ویژگیهای کلیدی Razor:
استفاده از سینتکس ساده: از @ برای جدا کردن کد C# از HTML استفاده میکند.
پشتیبانی از IntelliSense: بهبود یافته برای ویژوال استودیو و ویژوال استودیو کد.
عملکرد بالا: کدهای Razor به طور مستقیم به کدهای C# کامپایل میشوند.
نمونهای از کد Razor:
@{
ViewData["Title"] = "صفحه اصلی";
}
<h2>@ViewData["Title"]</h2>
<p>به برنامه Asp.Net Core MVC خوش آمدید!</p>
@if (User.Identity.IsAuthenticated)
{
<p>خوش آمدید, @User.Identity.Name!</p>
}
else
{
<p>لطفاً وارد شوید.</p>
}
در این مثال، از Razor برای مدیریت نمایش دادهها و منطق ساده استفاده شده است.
یک مثال عملی
@{
Layout = null;
}
<!DOCTYPE html>
<html lang="fa" dir="rtl">
<head>
<meta name="viewport" content="width=device-width" />
<title>Index</title>
</head>
<body>
<h1>صفحه تست</h1>
<h2>@DateTime.Now.ToString()</h2>
@{
string str = DateTime.Now.ToString();
@:سلام
@: زمان حال : @str
<text>
متن آزمایش
متن آزمایش
</text>
int a = 25;
}
<p>@a</p>
<hr />
@if (a == 25)
{
<text>این عدد برابر است با 25</text>
}
else
{
<text>مخالف 25 است</text>
}
<hr />
@for(int i=0;i<10;i++)
{
<h3>@i</h3>
}
</body>
</html>
مثلا می خواهید یک view بسازید برای ویرایش پروفایل کاربر پروفایل کابر نام و نام خانوادگی و ایمیل و چیزهای دیگر وقتی شما می خواهید ویرایش کنید تمامی اطلاعات کاربر را داخل text box یا کارتهای مربوطه وارد کنید و کاربر داده های خودش را ببیند و ویرایش کند view یک چیزی به نام model داره که میتواند کلاس سی شارپ باشد یا هر نوع داده ای که بهش پاس داد این model را می توانیم از اکشن به view پاس بدی
در مدل کلاس Users
namespace AspNetCorMVC.Models
{
public class Users
{
public string Name { get; set; }
public string Family { get; set; }
public string Email { get; set; }
}
}
در کنترلر UserController
using AspNetCorMVC.Models;
using Microsoft.AspNetCore.Mvc;
namespace AspNetCorMVC.Controllers
{
public class UserController : Controller
{
public IActionResult Index()
{
Users users = new Users()
{
Name ="ali",
Family ="rezai",
Email ="ali@yahoo.com"
};
return View(users);
}
}
}
در views پوشه User و Index.cshtml
نکته : در اینجا وقتی می خواهیم مدل view را معرفی کنیم باید model حروف کوچک اضافه کنیم و آدرس کلاس را بنویسیم و کلاس را معرفی کنیم و با استفاده از علامت @Model با حروف بزرگ می توانم به محتویات مدل دسترسی داشته باشم
@model AspNetCorMVC.Models.Users
@{
Layout = null;
}
<!DOCTYPE html>
<html lang="fa" dir="rtl">
<head>
<meta name="viewport" content="width=device-width" />
<title>Index</title>
</head>
<body>
<h1>صفحه کاربر</h1>
نام:<input type="text" value="@Model.Name"/> <br />
نام خانوادگی:<input type="text" value="@Model.Family"/> <br />
ایمیل:<input type="email" value="@Model.Email"/> <br />
<button>ذخیره</button>
</body>
</html>