شخصیسازی کدهای ایجاد شده توسط Scaffolding و آشنایی با T4 Templates.
شخصیسازی کدهای ایجاد شده توسط Scaffolding
برای شخصیسازی کدهایی که توسط Scaffolding تولید میشوند، میتوانید از تغییرات در الگوهای پیشفرض استفاده کنید. Scaffolding کدهای ابتدایی برای عملیاتهای CRUD و سایر کدهای مورد نیاز را به صورت خودکار ایجاد میکند، اما شما میتوانید این الگوها را تغییر دهید یا الگوهای خود را اضافه کنید تا به نیازهای خاص پروژهتان بپردازید.
مراحل شخصیسازی:
نصب پکیجهای مورد نیاز: ابتدا باید ابزارهای لازم برای Scaffolding را نصب کنید.
dotnet add package Microsoft.VisualStudio.Web.CodeGeneration.Design
اجرای دستور Scaffolding: اجرای دستور Scaffolding برای ایجاد کنترلر، ویو و سایر موارد مورد نیاز.
dotnet aspnet-codegenerator controller -name ProductsController -m Product -dc ApplicationDbContext --relativeFolderPath Controllers --useDefaultLayout --referenceScriptLibraries
شخصیسازی کدها: بعد از ایجاد کدها توسط Scaffolding، شما میتوانید کدها را به صورت دستی شخصیسازی کنید. به عنوان مثال، میتوانید فیلدهای اضافی اضافه کنید، نام کلاسها را تغییر دهید، روشهای اعتبارسنجی خاص خود را پیادهسازی کنید و غیره.
T4 Templates چیست؟
T4 (Text Template Transformation Toolkit)
یک موتور تولید کد در ویژوال استودیو است که به شما امکان میدهد فایلهای متنی (مثل کدهای C#, HTML, XML و ...) را به صورت پویا تولید کنید. T4 Templates میتوانند برای تولید کدهای پویای پیچیده و شخصیسازی الگوهای Scaffolding استفاده شوند.
استفاده از T4 Templates:
ایجاد یک T4 Template: برای ایجاد یک T4 Template، باید یک فایل با پسوند .tt ایجاد کنید.
نمونه T4 Template:
// MyTemplate.tt
<#@ template language="C#" #>
<#@ output extension=".cs" #>
<#@ import namespace="System" #>
<#@ import namespace="System.Text" #>
namespace GeneratedCode
{
public class GeneratedClass
{
public string GeneratedProperty { get; set; }
}
}
تولید کد با T4 Template: بعد از ذخیره فایل .tt، ویژوال استودیو به صورت خودکار کد تولید شده را ایجاد میکند. شما میتوانید از این کدهای تولید شده در پروژه خود استفاده کنید.
شخصیسازی T4 Templates برای Scaffolding: برای شخصیسازی Scaffolding با استفاده از T4 Templates، میتوانید الگوهای Scaffolding پیشفرض را تغییر دهید یا الگوهای جدیدی ایجاد کنید.
نتیجه:
با استفاده از T4 Templates، میتوانید کدهای تولید شده را به صورت پویا و براساس نیازهای پروژهتان شخصیسازی کنید. این کار به شما امکان میدهد تا الگوهای Scaffolding را تغییر دهید و بهبود بخشید.
در ASP.NET Core MVC، Binding یا اتصال دادهها فرآیندی است که طی آن دادههای ورودی از درخواست HTTP به پارامترهای اکشن کنترلر یا مدلهای دادهای تبدیل میشوند. این فرآیند به شما امکان میدهد تا دادهها را به راحتی از فرمهای HTML، درخواستهای URL و سایر منابع به مدلهای C# در سرور بفرستید و آنها را پردازش کنید.
انواع Binding:
Model Binding: Model Binding
دادههای ورودی را به پارامترهای اکشن کنترلر یا مدلها تبدیل میکند. این فرآیند شامل تبدیل دادهها از انواع مختلف (مثل رشتهها، اعداد، و غیره) به انواع دادهای مدلهای C# است.
public IActionResult Create(User user)
{
if (ModelState.IsValid)
{
// پردازش دادههای کاربر
}
return View(user);
}
Parameter Binding:
میتوانید دادهها را به صورت مستقیم به پارامترهای اکشن متصل کنید.
public IActionResult Details(int id)
{
// دریافت اطلاعات کاربر با استفاده از شناسه
var user = _userRepository.Find(id);
return View(user);
}
Form Binding:
دادههای ارسال شده از فرمها به پارامترهای اکشن یا مدلها متصل میشوند.
<form asp-action="Create" method="post">
<input type="text" name="UserName" />
<input type="text" name="Email" />
<button type="submit">ثبت نام</button>
</form>
نحوه کار Model Binding:
1-نامها و مقادیر: Model Binding با استفاده از نامهای فیلدها در فرم، دادهها را از درخواستها استخراج میکند و آنها را به مدل یا پارامترهای اکشن متصل میکند.
2-نوع دادهها: Model Binding دادهها را به نوعهای مناسب تبدیل میکند (مثلاً از رشته به عدد صحیح).
3-خطایابی: اگر دادهها قابل تبدیل نباشند یا خطای دیگری در اتصال وجود داشته باشد، خطاها در ModelState ثبت میشوند.
مثال کامل:
فرض کنید یک مدل کاربر و یک فرم HTML برای ثبتنام کاربر دارید:
مدل (User.cs):
public class User
{
public string UserName { get; set; }
public string Email { get; set; }
}
ویو (Register.cshtml):
@model YourNamespace.Models.User
<form asp-action="Register" method="post">
<div>
<label asp-for="UserName"></label>
<input asp-for="UserName" />
</div>
<div>
<label asp-for="Email"></label>
<input asp-for="Email" />
</div>
<button type="submit">ثبت نام</button>
</form>
کنترلر (UserController.cs):
public class UserController : Controller
{
[HttpPost]
public IActionResult Register(User user)
{
if (ModelState.IsValid)
{
// پردازش دادههای کاربر
TempData["Message"] = "ثبتنام موفقیتآمیز بود!";
return RedirectToAction("Index");
}
return View(user);
}
}
در این مثال:
دادههای فرم HTML به مدل User متصل میشوند.
متد Register در کنترلر دادههای متصل شده را دریافت میکند و اگر دادهها معتبر باشند، آنها را پردازش میکند.
با استفاده از Binding، میتوانید به راحتی دادههای ورودی را به مدلهای C# تبدیل کنید و آنها را پردازش کنید، که این فرآیند توسعه برنامههای وب را سادهتر و کارآمدتر میکند.
var searchKey = HttpContext.Request.Query["searchkey"].ToString();
این خط کد در زبان برنامهنویسی C# و در چارچوب ASP.NET Core استفاده میشود و به دنبال مقدار یک پارامتر کوئری (query parameter) به نام "searchkey" در درخواست HTTP جاری است. این پارامتر میتواند در URL درخواست وجود داشته باشد. بیایید این را به صورت جزئیتر بررسی کنیم:
اجزای کد:
HttpContext:
HttpContext شامل اطلاعات مربوط به درخواست جاری HTTP و پاسخ مرتبط با آن است.
این شیء در یک کنترلر ASP.NET Core به صورت پیشفرض در دسترس است.
Request:
Request شامل اطلاعاتی درباره درخواست جاری، از جمله هدرها، کوئری استرینگها، فرمها، و غیره است.
Query:
Query یک مجموعه است که شامل تمام پارامترهای کوئری (query parameters) از URL درخواست جاری است. این پارامترها معمولاً پس از ? در URL قرار میگیرند.
به عنوان مثال، در URL https://example.com?searchkey=value، searchkey یک پارامتر کوئری است.
["searchkey"]:
این قسمت به دنبال یک پارامتر کوئری به نام "searchkey" در مجموعه کوئریها میگردد. اگر پارامتر "searchkey" وجود داشته باشد، مقدار آن برگردانده میشود.
ToString():
ToString() مقدار یافت شده را به رشته تبدیل میکند.
مثال:
فرض کنید شما یک URL به صورت زیر دارید:
https://example.com?searchkey=mysearchterm
در کد بالا:
HttpContext.Request.Query["searchkey"] مقدار mysearchterm را برمیگرداند.
ToString() اطمینان میدهد که مقدار به صورت رشته (string) استفاده میشود.
استفاده در اکشن کنترلر:
یک مثال کاربردی از این کد در یک اکشن کنترلر میتواند به صورت زیر باشد:
public IActionResult Search()
{
var searchKey = HttpContext.Request.Query["searchkey"].ToString();
// استفاده از searchKey برای جستجو در پایگاه داده یا منطق دیگر
var results = _searchService.Search(searchKey);
return View(results);
}
در این مثال، مقدار searchkey از URL خوانده شده و برای انجام عملیات جستجو استفاده میشود.
میتوانید پارامتر searchkey را مستقیماً به عنوان پارامتر اکشن کنترلر تعریف کنید. این روش معمولاً سادهتر و خواناتر است و به ASP.NET Core اجازه میدهد به صورت خودکار دادههای کوئری استرینگ را به پارامترهای اکشن متصل کند.
مثال:
کنترلر با پارامتر اکشن:
public IActionResult Search(string searchkey)
{
// استفاده از searchkey برای جستجو در پایگاه داده یا منطق دیگر
var results = _searchService.Search(searchkey);
return View(results);
}
در این مثال:
پارامتر searchkey به طور خودکار مقدار داده شده از کوئری استرینگ را دریافت میکند.
نیاز به استفاده مستقیم از HttpContext.Request.Query در اکشن نیست.
مثال URL:
برای درخواست به این اکشن، میتوانید از یک URL به صورت زیر استفاده کنید:
https://example.com/Search?searchkey=mysearchterm
در این حالت، searchkey به صورت خودکار با مقدار mysearchterm مقداردهی میشود و به اکشن ارسال میشود.
این روش به شما امکان میدهد که کد خود را سادهتر و خواناتر کنید و از مزایای اتصالات خودکار دادهها در ASP.NET Core بهرهمند شوید.
در ASP.NET Core، From attributes برای مشخص کردن منبع دادههای ورودی استفاده میشود که به پارامترهای اکشن کنترلر متصل میشوند. این attributes به شما امکان میدهند که دادهها را از منابع مختلفی مانند کوئری استرینگها، بدنه درخواست (request body)، هدرها، و غیره دریافت کنید. این ویژگیها به مدل بایندینگ کمک میکنند تا دادههای ورودی را به درستی به پارامترهای اکشن متصل کنند.
انواع From Attributes:
[FromQuery]:
این attribute مشخص میکند که دادهها از کوئری استرینگ درخواست خوانده شوند.
مثال:
public IActionResult Get([FromQuery] string searchkey)
{
// searchkey از کوئری استرینگ گرفته شده است.
}
[FromRoute]:
این attribute مشخص میکند که دادهها از پارامترهای مسیر (route parameters) خوانده شوند.
مثال:
[HttpGet("{id}")]
public IActionResult GetById([FromRoute] int id)
{
// id از پارامتر مسیر گرفته شده است.
}
[FromBody]:
این attribute مشخص میکند که دادهها از بدنه درخواست (request body) خوانده شوند.
مثال:
[HttpPost]
public IActionResult Create([FromBody] User user)
{
// user از بدنه درخواست گرفته شده است.
}
[FromHeader]:
این attribute مشخص میکند که دادهها از هدرهای HTTP خوانده شوند.
مثال:
public IActionResult GetFromHeader([FromHeader] string authorization)
{
// authorization از هدر HTTP گرفته شده است.
}
[FromForm]:
این attribute مشخص میکند که دادهها از فرمهای HTML خوانده شوند.
مثال:
[HttpPost]
public IActionResult Create([FromForm] User user)
{
// user از دادههای فرم HTML گرفته شده است.
}
[FromServices]:
این attribute مشخص میکند که پارامتر از سرویسهای DI (Dependency Injection) پر شود.
مثال:
public IActionResult GetService([FromServices] IMyService myService)
{
// myService از سرویسهای DI گرفته شده است.
}
مثال عملی:
فرض کنید میخواهید یک اکشن کنترلر داشته باشید که اطلاعات کاربری را با استفاده از چندین منبع ورودی دریافت کند:
public class UserController : Controller
{
[HttpPost]
public IActionResult Create(
[FromQuery] string referrer,
[FromBody] User user,
[FromHeader] string authorization)
{
// دریافت دادهها از منابع مختلف:
// referrer از کوئری استرینگ
// user از بدنه درخواست
// authorization از هدر HTTP
// پردازش دادهها و ایجاد کاربر جدید
}
}
با استفاده از From attributes، میتوانید به وضوح مشخص کنید که دادههای ورودی از کجا باید گرفته شوند و این کار باعث میشود کدهای کنترلر شما تمیزتر و قابل نگهداریتر باشند.
قوانین کد نویسی تمیز متد ها نباید بیش از سه پارامتر ورودی داشته باشد و اگر بیش از سه پارامتر ورودی داشتید از مدل ها استفده کنید
یکی از اصول کلیدی در کد نویسی تمیز است که توسط نویسندگان معروفی چون رابرت سی. مارتین (Robert C. Martin) در کتاب "کد تمیز" (Clean Code) مطرح شده است. این قانون پیشنهاد میکند که تعداد پارامترهای ورودی به متدها باید کمینه باشد، و در صورت نیاز به بیش از سه پارامتر، بهتر است از مدلها (کلاسهای دادهای) استفاده شود.
دلایل برای استفاده از این قانون:
قابلیت خوانایی و نگهداری:
متدهایی با تعداد پارامترهای کمتر، خواناتر و قابل نگهداریتر هستند. این متدها معمولاً سادهتر و قابل فهمتر هستند.
کاهش پیچیدگی:
تعداد زیاد پارامترها میتواند منجر به پیچیدگی بالای متد شود، که فهمیدن و تست کردن آن را دشوار میکند.
کاهش احتمال اشتباه:
هنگامی که تعداد پارامترها زیاد باشد، احتمال بروز اشتباه در ترتیب یا نوع دادهها افزایش مییابد.
استفاده از مدلها:
در صورتی که نیاز به بیش از سه پارامتر دارید، میتوانید این پارامترها را در یک کلاس دادهای (مدل) تعریف کنید و از آن در متدها استفاده کنید.
مثال:
فرض کنید متدی دارید که نیاز به چندین پارامتر برای ایجاد یک کاربر جدید دارد.
بدون استفاده از مدل:
public void CreateUser(string firstName, string lastName, int age, string email, string phoneNumber)
{
// کد ایجاد کاربر
}
با استفاده از مدل:
ابتدا یک مدل برای کاربر ایجاد کنید:
public class UserModel
{
public string FirstName { get; set; }
public string LastName { get; set; }
public int Age { get; set; }
public string Email { get; set; }
public string PhoneNumber { get; set; }
}
سپس متد را با استفاده از مدل تغییر دهید:
public void CreateUser(UserModel user)
{
// کد ایجاد کاربر با استفاده از مدل
}
مزایای استفاده از مدل:
کاهش تعداد پارامترها: مدلها تعداد پارامترهای ورودی به متد را کاهش میدهند و کد را خواناتر میکنند.
بهبود سازماندهی دادهها: مدلها به شما امکان میدهند تا دادههای مرتبط را به صورت منسجم و منظم نگه دارید.
افزایش قابلیت توسعه: افزودن یا تغییر پارامترها در آینده سادهتر خواهد بود.
با رعایت این اصل، کدهای شما خواناتر، قابل نگهداریتر و قابل توسعهتر خواهند بود. اگر سوالات دیگری دارید یا نیاز به توضیحات بیشتری دارید، بفرمایید!
در ASP.NET Core MVC، ViewData یک دیکشنری (Dictionary) است که برای ارسال دادهها از کنترلر به ویو استفاده میشود. این روش به شما امکان میدهد تا دادههای مختلف را بین کنترلر و ویو به اشتراک بگذارید و آنها را در ویو نمایش دهید. ViewData به صورت کلمه-مقدار (key-value) کار میکند، یعنی هر داده با یک کلید خاص ذخیره و بازیابی میشود.
ویژگیها:
نوع داده: ViewData از نوع ViewDataDictionary است که وراثت از Dictionary<string, object> دارد.
استفاده آسان: از آنجا که ViewData به صورت دینامیک کار میکند، میتوانید هر نوع دادهای را به آن اضافه کنید.
دسترسی از ویو: دادههای ذخیره شده در ViewData به راحتی در ویو قابل دسترسی و نمایش هستند.
مثال ساده:
کنترلر (HomeController.cs):
public class HomeController : Controller
{
public IActionResult Index()
{
ViewData["Message"] = "Welcome to ASP.NET Core MVC!";
ViewData["Year"] = DateTime.Now.Year;
return View();
}
}
ویو (Index.cshtml):
@{
ViewData["Title"] = "Home Page";
}
<h1>@ViewData["Message"]</h1>
<p>Current Year: @ViewData["Year"]</p>
توضیحات:
در کنترلر:
مقدار "Welcome to ASP.NET Core MVC!" در ViewData با کلید "Message" ذخیره شده است.
مقدار سال جاری (DateTime.Now.Year) نیز در ViewData با کلید "Year" ذخیره شده است.
در ویو:
با استفاده از @ViewData["Message"] و @ViewData["Year"]، میتوانید مقادیر ذخیره شده در ViewData را در ویو نمایش دهید.
تفاوت با سایر روشها:
ViewBag:
ViewBag
یک ویژگی دینامیک است که بر پایه ViewData ساخته شده است و استفاده از آن به صورت پویا راحتتر است.
مثال: ViewBag.Message = "Hello";
TempData:
TempData
برای نگهداری دادهها بین درخواستها استفاده میشود (برای مثال، برای انتقال دادهها پس از یک ریدایرکت).
مثال: TempData["Message"] = "Data saved successfully!";
مزایا:
ساده و سریع: استفاده از ViewData سریع و ساده است و به شما امکان میدهد تا به راحتی دادهها را بین کنترلر و ویو به اشتراک بگذارید.
انعطافپذیر: میتوانید هر نوع دادهای را به ViewData اضافه کنید.
معایب:
خطایابی دشوار: چون ViewData به صورت دینامیک کار میکند و تایپهای دادهها کنترل نمیشود، ممکن است خطاهایی ناشی از دسترسی اشتباه به دادهها رخ دهد.
نیاز به تبدیل دادهها: برای استفاده از دادهها، ممکن است نیاز به تبدیل (Casting) آنها به نوع مناسب داشته باشید.
استفاده از ViewData به خصوص زمانی مفید است که نیاز دارید دادههای ساده و کوچک را بین کنترلر و ویو به اشتراک بگذارید. اما برای دادههای پیچیدهتر و تایپ شده، بهتر است از مدلها (Models) یا ViewModelها استفاده کنید.
در ASP.NET Core MVC، ViewBag یک ویژگی دینامیک است که به شما امکان میدهد تا دادهها را از کنترلر به ویو انتقال دهید. ViewBag مانند ViewData برای انتقال دادهها بین کنترلر و ویو استفاده میشود، اما با دسترسی سادهتر و سریعتر.
ویژگیها:
دینامیک: ViewBag از نوع dynamic است، بنابراین نیازی به تعریف کلیدهای خاص مانند ViewData ندارید.
استفاده آسان: از ViewBag به صورت دینامیک استفاده میشود و میتوانید مستقیماً به خواص آن دسترسی داشته باشید.
خوانایی بهتر: به دلیل استفاده از خواص دینامیک، ViewBag میتواند کدها را خواناتر و تمیزتر کند.
مثال:
کنترلر (HomeController.cs):
public class HomeController : Controller
{
public IActionResult Index()
{
ViewBag.Message = "Welcome to ASP.NET Core MVC!";
ViewBag.Year = DateTime.Now.Year;
return View();
}
}
ویو (Index.cshtml):
@{
ViewBag.Title = "Home Page";
}
<h1>@ViewBag.Message</h1>
<p>Current Year: @ViewBag.Year</p>
توضیحات:
در کنترلر:
مقدار "Welcome to ASP.NET Core MVC!" به خواص ViewBag.Message اختصاص داده شده است.
مقدار سال جاری (DateTime.Now.Year) نیز به خواص ViewBag.Year اختصاص داده شده است.
در ویو:
با استفاده از @ViewBag.Message و @ViewBag.Year، میتوانید مقادیر ذخیره شده در ViewBag را در ویو نمایش دهید.
تفاوت با ViewData:
نوع داده: ViewBag یک ویژگی دینامیک است در حالی که ViewData یک دیکشنری است.
استفاده آسان: استفاده از ViewBag سادهتر و سریعتر است، زیرا نیازی به استفاده از کلیدهای رشتهای نیست.
قابلیتهای یکسان: هر دو ViewBag و ViewData برای انتقال دادهها بین کنترلر و ویو استفاده میشوند و دادهها تا پایان درخواست جاری معتبر هستند.
مثال کاربردیتر:
فرض کنید میخواهید پیغام خوشآمدگویی و سال جاری را از کنترلر به ویو منتقل کنید و نمایش دهید:
کنترلر (HomeController.cs):
public class HomeController : Controller
{
public IActionResult About()
{
ViewBag.Message = "Your application description page.";
ViewBag.Year = DateTime.Now.Year;
return View();
}
}
ویو (About.cshtml):
@{
ViewBag.Title = "About";
}
<h1>@ViewBag.Title</h1>
<p>@ViewBag.Message</p>
<p>Current Year: @ViewBag.Year</p>
با استفاده از ViewBag، میتوانید دادهها را به راحتی و به صورت دینامیک بین کنترلر و ویو انتقال دهید و نمایش دهید.
ViewData
یک دیکشنری (Dictionary) در ASP.NET Core MVC است که برای انتقال دادهها از کنترلر به ویو استفاده میشود. این دیکشنری به صورت کلمه-مقدار (key-value) کار میکند، که به شما امکان میدهد دادههای مختلفی را بین کنترلر و ویو به اشتراک بگذارید.
ویژگیها:
نوع داده: ViewData از نوع ViewDataDictionary است که از Dictionary<string, object> وراثت میبرد.
استفاده از کلیدها: هر داده در ViewData با یک کلید خاص ذخیره میشود.
سازگاری با انواع دادهها: میتوانید انواع دادههای مختلف را به ViewData اضافه کنید.
مثال ساده:
کنترلر (HomeController.cs):
public class HomeController : Controller
{
public IActionResult Index()
{
ViewData["Message"] = "به ASP.NET Core MVC خوش آمدید!";
ViewData["Year"] = DateTime.Now.Year;
return View();
}
}
ویو (Index.cshtml):
@{
ViewData["Title"] = "صفحه اصلی";
}
<h1>@ViewData["Message"]</h1>
<p>سال جاری: @ViewData["Year"]</p>
توضیحات:
در کنترلر:
مقدار "به ASP.NET Core MVC خوش آمدید!" در ViewData با کلید "Message" ذخیره میشود.
مقدار سال جاری (DateTime.Now.Year) نیز در ViewData با کلید "Year" ذخیره میشود.
در ویو:
با استفاده از @ViewData["Message"] و @ViewData["Year"]، میتوانید مقادیر ذخیره شده در ViewData را در ویو نمایش دهید.
تفاوت با سایر روشها:
ViewBag:
ViewBag یک ویژگی دینامیک است که بر پایه ViewData ساخته شده است و استفاده از آن به صورت پویا راحتتر است.
مثال: ViewBag.Message = "Hello";
TempData:
TempData برای نگهداری دادهها بین درخواستها استفاده میشود (برای مثال، برای انتقال دادهها پس از یک ریدایرکت).
مثال: TempData["Message"] = "داده با موفقیت ذخیره شد!";
مزایا:
ساده و سریع: استفاده از ViewData سریع و ساده است و به شما امکان میدهد تا به راحتی دادهها را بین کنترلر و ویو به اشتراک بگذارید.
انعطافپذیر: میتوانید هر نوع دادهای را به ViewData اضافه کنید.
معایب:
خطایابی دشوار: چون ViewData به صورت دینامیک کار میکند و تایپهای دادهها کنترل نمیشود، ممکن است خطاهایی ناشی از دسترسی اشتباه به دادهها رخ دهد.
نیاز به تبدیل دادهها: برای استفاده از دادهها، ممکن است نیاز به تبدیل (Casting) آنها به نوع مناسب داشته باشید.
مثال کاربردی:
فرض کنید میخواهید اطلاعات یک کاربر را از کنترلر به ویو منتقل کنید و نمایش دهید:
کنترلر (UserController.cs):
public class UserController : Controller
{
public IActionResult Details(int id)
{
var user = _userRepository.Find(id);
ViewData["User"] = user;
return View();
}
}
ویو (Details.cshtml):
@{
var user = ViewData["User"] as YourNamespace.Models.User;
}
<h1>جزئیات کاربر</h1>
<p>نام: @user.Name</p>
<p>ایمیل: @user.Email</p>
استفاده از ViewData به خصوص زمانی مفید است که نیاز دارید دادههای ساده و کوچک را بین کنترلر و ویو به اشتراک بگذارید. اما برای دادههای پیچیدهتر و تایپ شده، بهتر است از مدلها (Models) یا ViewModelها استفاده کنید.
TempDataیک ویژگی در ASP.NET Core MVC است که برای نگهداری دادهها بین درخواستها (requests) استفاده میشود.
TempDataبه شما امکان میدهد که دادههایی را که باید پس از ریدایرکت به اکشن دیگر یا حتی بعد از یک درخواست جدید باقی بمانند، ذخیره کنید. این ویژگی به ویژه برای سناریوهایی که نیاز به انتقال پیامها یا دادهها پس از عملیاتهایی مانند ریدایرکت یا پست-ریدایرکت-گت (Post-Redirect-Get) هستند، مفید است. ویژگیها: 1. نگهداری دادهها بین درخواستها:
TempDataمیتواند دادهها را بین درخواستهای مختلف نگهداری کند. 2. استفاده از دیکشنری:
TempDataیک دیکشنری از نوع
TempDataDictionaryاست که وراثت از
IDictionary<string, object>دارد. 3. پاک شدن خودکار: دادههای ذخیره شده در
TempDataپس از خواندن پاک میشوند. مثال: فرض کنید میخواهید پیغام موفقیتآمیزی پس از ایجاد یک کاربر نمایش دهید. کنترلر (UserController.cs): public class UserController : Controller { [HttpPost] public IActionResult Create(User user) { if (ModelState.IsValid) { // ذخیره کاربر در پایگاه داده (فرض کنید این کار انجام شده است) TempData["Message"] = "کاربر با موفقیت ایجاد شد!"; return RedirectToAction("Index"); } return View(user); } public IActionResult Index() { return View(); } } ویو (Index.cshtml): @{ var message = TempData["Message"] as string; } @if (!string.IsNullOrEmpty(message)) { <div class="alert alert-success"> @message </div> } <h1>لیست کاربران</h1> <!-- بقیه کدهای ویو --> توضیحات: - در کنترلر: - در اکشن
Create، پس از موفقیت در ایجاد کاربر، پیغام موفقیتآمیز در
TempDataذخیره میشود. - سپس به اکشن
Indexریدایرکت میشود. - در ویو: - مقدار
TempData["Message"]در ویو خوانده شده و اگر پیامی موجود باشد، به کاربر نمایش داده میشود. - پس از خواندن مقدار از
TempData, دادهها به صورت خودکار پاک میشوند. کاربردها: 1. پیامهای موقت: انتقال پیامهای موفقیت، خطا یا هشدار بین درخواستها. 2. دادههای موقت: نگهداری دادههای موقت که نیاز به بقای بین درخواستهای مختلف دارند. 3. Post-Redirect-Get (PRG) Pattern: انتقال دادهها پس از یک عملیات پست و ریدایرکت به یک اکشن دیگر. تفاوت با ViewData و ViewBag: - نگهداری دادهها:
ViewDataو
ViewBagتنها در طول درخواست جاری معتبر هستند و برای انتقال دادهها بین درخواستها استفاده نمیشوند. - پایداری دادهها:
TempDataدادهها را بین درخواستها نگه میدارد، در حالی که
ViewDataو
ViewBagفقط برای درخواست جاری معتبر هستند. استفاده از
TempDataبه شما امکان میدهد که دادههای موقت را بین درخواستها نگهداری و مدیریت کنید، که این ویژگی برای سناریوهایی مانند نمایش پیامهای موفقیتآمیز پس از ریدایرکت بسیار مفید است.
سلام! پارشیال ویو (Partial View) در ASP.NETCore MVC یک ویو (View) قابل استفاده مجدد است که میتواند بخشی از یک ویوی بزرگتر باشد. پارشیال ویوها به شما امکان میدهند که اجزای ویو را جداگانه نگهداری و مدیریت کنید و از آنها در چندین ویو یا کنترلر استفاده کنید. این ویژگی به شما کمک میکند تا کد ویو را تمیزتر و قابل نگهداریتر کنید.
نحوه ایجاد پارشیال ویو:
ایجاد پارشیال ویو:
پارشیال ویوها را در پوشه Views/Shared یا در پوشه خاص ویوها قرار دهید.
نام فایل پارشیال ویو باید با _ شروع شود (مثلاً _MyPartialView.cshtml).
مثال پارشیال ویو (_MyPartialView.cshtml):
<div>
<h2>@Model.Title</h2>
<p>@Model.Description</p>
</div>
- استفاده از HTML Helper:
برای استفاده از پارشیال ویو با HTML Helper، از متد Html.Partial یا Html.RenderPartial استفاده کنید.
مثال استفاده از HTML Helper:
@model YourNamespace.Models.MyModel
<div>
<h1>صفحه اصلی</h1>
@Html.Partial("_MyPartialView", Model)
</div>
در این مثال، پارشیال ویو _MyPartialView با مدل MyModel رندر میشود.
- استفاده از Tag Helper:
برای استفاده از پارشیال ویو با Tag Helper، از تگ <partial> استفاده کنید.
مثال استفاده از Tag Helper:
@model YourNamespace.Models.MyModel
<div>
<h1>صفحه اصلی</h1>
<partial name="_MyPartialView" model="Model" />
</div>
مزایای استفاده از پارشیال ویو:
قابلیت استفاده مجدد: اجزای ویو را میتوان در چندین ویو و کنترلر استفاده کرد.
نگهداری و خوانایی بهتر: کد ویو تمیزتر و قابل نگهداریتر است.
تست راحتتر: میتوان پارشیال ویوها را به صورت مستقل تست کرد.
با استفاده از پارشیال ویوها، میتوانید ساختار ویوهای خود را سادهتر و قابل نگهداریتر کنید و از تکرار کدهای مشابه جلوگیری کنید.
ViewComponent چیست؟
ViewComponent ها
در ASP.NETCore MVC اجزای قابل استفاده مجدد هستند که شبیه به پارشیال ویوها عمل میکنند، اما دارای منطق پردازش مجزا هستند. آنها به شما امکان میدهند که بلوکهای پیچیده UI را با منطق و رندرینگ مجزا ایجاد کنید.
ویژگیها و مزایا:
قابلیت استفاده مجدد: میتوانید ViewComponent ها را در چندین ویو و کنترلر استفاده کنید.
جدا کردن منطق از نمایه: ViewComponent ها دارای منطق پردازش مستقل از ویوها هستند.
بهبود تستپذیری: ViewComponent ها به راحتی تستپذیر هستند زیرا منطق آنها جدا از ویوها است.
نحوه ایجاد و استفاده از ViewComponent:
ایجاد ViewComponent:
یک کلاس ViewComponent ایجاد کنید و از ViewComponent ارث ببرید.
متد Invoke یا InvokeAsync را پیادهسازی کنید.
مثال:
کلاسی به نام MyViewComponent ایجاد کنید:
public class MyViewComponent : ViewComponent
{
public IViewComponentResult Invoke(string message)
{
return View("Default", message);
}
}
ایجاد ویوی ViewComponent:
یک ویو با نام Default.cshtml در پوشه Views/Shared/Components/MyViewComponent ایجاد کنید.
مثال ویو (Default.cshtml):
<div>
<h2>پیام شما:</h2>
<p>@Model</p>
</div>
استفاده از ViewComponent در ویو:
با استفاده از Tag Helper میتوانید ViewComponent را در ویو فراخوانی کنید.
استفاده از Tag Helper:
<vc:my message="سلام به ViewComponent!" />
با استفاده از ViewComponent ها میتوانید اجزای پیچیده UI را ایجاد کرده و منطق و رندرینگ آنها را به صورت مجزا مدیریت کنید. این کار به شما کمک میکند تا کدهای خود را تمیزتر و قابل نگهداریتر کنید و قابلیت استفاده مجدد اجزا را افزایش دهید.