eitaa logo
پروژه ASP.Net Core MVC (وب و سی شارپ)
120 دنبال‌کننده
168 عکس
38 ویدیو
376 فایل
❁﷽❁ آموزش 📖 برنامه نویسی ASP.Net Core MVC (وب و سی شارپ) Admin: @alialirezapanahi برنامه نویسی برنامه نویسی سی شارپ eitaa.com/sisharpapp برنامه نویسی وب eitaa.com/aspdatnet ویراستی virasty.com/alialirezapanahi آپارات aparat.com/alialirezapanahi
مشاهده در ایتا
دانلود
برای ساخت یک کنترلر در ASP.NET Core MVC که شامل عملیات CRUD (ایجاد، خواندن، به‌روزرسانی و حذف) برای موجودیتی با فیلدهای Id, Name, Age, Mobile و Email باشد، نیاز به ایجاد چند View دارید. در اینجا یک راهنمایی کلی برای ایجاد این Views و کنترلر آورده شده است: مدل (Model): public class Person { public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } public string Mobile { get; set; } public string Email { get; set; } } کنترلر (Controller): public class PersonsController : Controller { private readonly ApplicationDbContext _context; public PersonsController(ApplicationDbContext context) { _context = context; } // GET: Persons public async Task<IActionResult> Index() { return View(await _context.Persons.ToListAsync()); } // GET: Persons/Details/5 public async Task<IActionResult> Details(int? id) { if (id == null) { return NotFound(); } var person = await _context.Persons .FirstOrDefaultAsync(m => m.Id == id); if (person == null) { return NotFound(); } return View(person); } // GET: Persons/Create public IActionResult Create() { return View(); } // POST: Persons/Create [HttpPost] [ValidateAntiForgeryToken] public async Task<IActionResult> Create([Bind("Id,Name,Age,Mobile,Email")] Person person) { if (ModelState.IsValid) { _context.Add(person); await _context.SaveChangesAsync(); return RedirectToAction(nameof(Index)); } return View(person); } // GET: Persons/Edit/5 public async Task<IActionResult> Edit(int? id) { if (id == null) { return NotFound(); } var person = await _context.Persons.FindAsync(id); if (person == null) { return NotFound(); } return View(person); } // POST: Persons/Edit/5 [HttpPost] [ValidateAntiForgeryToken] public async Task<IActionResult> Edit(int id, [Bind("Id,Name,Age,Mobile,Email")] Person person) { if (id != person.Id) { return NotFound(); } if (ModelState.IsValid) { try { _context.Update(person); await _context.SaveChangesAsync(); } catch (DbUpdateConcurrencyException) { if (!PersonExists(person.Id)) { return NotFound(); } else { throw; } } return RedirectToAction(nameof(Index)); } return View(person); } // GET: Persons/Delete/5 public async Task<IActionResult> Delete(int? id) { if (id == null) { return NotFound(); } var person = await _context.Persons .FirstOrDefaultAsync(m => m.Id == id); if (person == null) { return NotFound(); } return View(person); } // POST: Persons/Delete/5 [HttpPost, ActionName("Delete")] [ValidateAntiForgeryToken] public async Task<IActionResult> DeleteConfirmed(int id) { var person = await _context.Persons.FindAsync(id); _context.Persons.Remove(person); await _context.SaveChangesAsync(); return RedirectToAction(nameof(Index)); } private bool PersonExists(int id) { return _context.Persons.Any(e => e.Id == id); } } ویوها (Views): Index.cshtml: لیست اشخاص Details.cshtml: نمایش جزئیات یک شخص Create.cshtml: فرم ایجاد یک شخص جدید Edit.cshtml: فرم ویرایش یک شخص Delete.cshtml: فرم تأیید حذف یک شخص
بیایید ادامه‌ی کدهای ویو را با هم بررسی کنیم تا کامل شوند: Viewها: Index.cshtml این فایل لیست تمامی اشخاص را نمایش می‌دهد: @model IEnumerable<Person> @{ ViewData["Title"] = "Persons List"; } <h2>Persons List</h2> <table class="table"> <thead> <tr> <th>Name</th> <th>Age</th> <th>Mobile</th> <th>Email</th> <th></th> </tr> </thead> <tbody> @foreach (var item in Model) { <tr> <td>@item.Name</td> <td>@item.Age</td> <td>@item.Mobile</td> <td>@item.Email</td> <td> <a asp-action="Edit" asp-route-id="@item.Id">Edit</a> | <a asp-action="Details" asp-route-id="@item.Id">Details</a> | <a asp-action="Delete" asp-route-id="@item.Id">Delete</a> </td> </tr> } </tbody> </table> <a asp-action="Create">Create New Person</a> Details.cshtml این فایل جزئیات یک شخص خاص را نمایش می‌دهد: @model Person @{ ViewData["Title"] = "Person Details"; } <h2>Person Details</h2> <div> <h4>Person</h4> <hr /> <dl class="row"> <dt class = "col-sm-2">Name</dt> <dd class = "col-sm-10">@Model.Name</dd> <dt class = "col-sm-2">Age</dt> <dd class = "col-sm-10">@Model.Age</dd> <dt class = "col-sm-2">Mobile</dt> <dd class = "col-sm-10">@Model.Mobile</dd> <dt class = "col-sm-2">Email</dt> <dd class = "col-sm-10">@Model.Email</dd> </dl> </div> <div> <a asp-action="Edit" asp-route-id="@Model.Id">Edit</a> | <a asp-action="Index">Back to List</a> </div> Create.cshtml این فایل فرم ایجاد یک شخص جدید را نمایش می‌دهد: @model Person @{ ViewData["Title"] = "Create Person"; } <h2>Create Person</h2> <h4>Person</h4> <hr /> <form asp-action="Create"> <div class="form-group"> <label asp-for="Name" class="control-label"></label> <input asp-for="Name" class="form-control" /> <span asp-validation-for="Name" class="text-danger"></span> </div> <div class="form-group"> <label asp-for="Age" class="control-label"></label> <input asp-for="Age" class="form-control" /> <span asp-validation-for="Age" class="text-danger"></span> </div> <div class="form-group"> <label asp-for="Mobile" class="control-label"></label> <input asp-for="Mobile" class="form-control" /> <span asp-validation-for="Mobile" class="text-danger"></span> </div> <div class="form-group"> <label asp-for="Email" class="control-label"></label> <input asp-for="Email" class="form-control" /> <span asp-validation-for="Email" class="text-danger"></span> </div> <div class="form-group"> <input type="submit" value="Create" class="btn btn-primary" /> </div> </form> <div> <a asp-action="Index">Back to List</a> </div>
Edit.cshtml این فایل فرم ویرایش یک شخص موجود را نمایش می‌دهد: @model Person @{ ViewData["Title"] = "Edit Person"; } <h2>Edit Person</h2> <h4>Person</h4> <hr /> <form asp-action="Edit"> <div class="form-group"> <input type="hidden" asp-for="Id" /> <label asp-for="Name" class="control-label"></label> <input asp-for="Name" class="form-control" /> <span asp-validation-for="Name" class="text-danger"></span> </div> <div class="form-group"> <label asp-for="Age" class="control-label"></label> <input asp-for="Age" class="form-control" /> <span asp-validation-for="Age" class="text-danger"></span> </div> <div class="form-group"> <label asp-for="Mobile" class="control-label"></label> <input asp-for="Mobile" class="form-control" /> <span asp-validation-for="Mobile" class="text-danger"></span> </div> <div class="form-group"> <label asp-for="Email" class="control-label"></label> <input asp-for="Email" class="form-control" /> <span asp-validation-for="Email" class="text-danger"></span> </div> <div class="form-group"> <input type="submit" value="Save" class="btn btn-primary" /> </div> </form> <div> <a asp-action="Index">Back to List</a> </div> Delete.cshtml این فایل فرم تأیید حذف یک شخص را نمایش می‌دهد: @model Person @{ ViewData["Title"] = "Delete Person"; } <h2>Delete Person</h2> <h4>Person</h4> <hr /> <dl class="row"> <dt class = "col-sm-2">Name</dt> <dd class = "col-sm-10">@Model.Name</dd> <dt class = "col-sm-2">Age</dt> <dd class = "col-sm-10">@Model.Age</dd> <dt class = "col-sm-2">Mobile</dt> <dd class = "col-sm-10">@Model.Mobile</dd> <dt class = "col-sm-2">Email</dt> <dd class = "col-sm-10">@Model.Email</dd> </dl> <form asp-action="Delete"> <input type="hidden" asp-for="Id" /> <input type="submit" value="Delete" class="btn btn-danger" /> | <a asp-action="Index">Back to List</a> </form> به این ترتیب می‌توانید کنترلر و ویو‌های مورد نیاز برای عملیات CRUD را در ASP.NET Core MVC ایجاد کنید.
WebApplication4.zip
حجم: 18.3M
پروژه Scaffolding آدرس اکشن localhost:28987/scaffoldinguser
شخصی‌سازی کدهای ایجاد شده توسط 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، می‌توانید داده‌ها را به راحتی و به صورت دینامیک بین کنترلر و ویو انتقال دهید و نمایش دهید.