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
مشاهده در ایتا
دانلود
Fluent Validation یک کتابخانه محبوب در دات‌نت است که امکان ایجاد قوانین اعتبارسنجی قدرتمند و منعطف را با استفاده از کدهای fluent فراهم می‌کند. به جای استفاده از Data Annotations، می‌توانید اعتبارسنجی‌های خود را با استفاده از کلاس‌های جداگانه تعریف کنید که قوانین اعتبارسنجی را به صورت روان و خوانا ایجاد می‌کنند. نصب Fluent Validation ابتدا باید کتابخانه FluentValidation را نصب کنید. می‌توانید از طریق NuGet Package Manager این کار را انجام دهید: dotnet add package FluentValidation ایجاد یک Validator یک کلاس Validator برای مدل خود ایجاد کنید. در این مثال، یک مدل به نام User و یک کلاس Validator برای آن ایجاد می‌کنیم: مدل (User.cs): public class User { public string UserName { get; set; } public string Email { get; set; } public string Password { get; set; } } Validator (UserValidator.cs): using FluentValidation; public class UserValidator : AbstractValidator<User> { public UserValidator() { RuleFor(user => user.UserName) .NotEmpty().WithMessage("لطفا نام کاربری خود را وارد کنید") .Length(1, 100).WithMessage("نام کاربری نباید بیش از 100 کاراکتر باشد"); RuleFor(user => user.Email) .NotEmpty().WithMessage("لطفا ایمیل خود را وارد کنید") .EmailAddress().WithMessage("لطفا یک ایمیل معتبر وارد کنید"); RuleFor(user => user.Password) .NotEmpty().WithMessage("لطفا رمز عبور خود را وارد کنید") .Length(6, 100).WithMessage("رمز عبور باید حداقل 6 کاراکتر باشد و نباید بیش از 100 کاراکتر باشد"); } } پیکربندی FluentValidation در ASP.NET Core باید FluentValidation را به سرویس‌های خود در Program.cs یا Startup.cs اضافه کنید: پیکربندی در Program.cs: var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllersWithViews(); // افزودن FluentValidation builder.Services.AddFluentValidation(fv => fv.RegisterValidatorsFromAssemblyContaining<UserValidator>()); var app = builder.Build(); app.UseRouting(); app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); }); app.Run(); استفاده از Validator در کنترلر کنترلر خود را طوری تنظیم کنید که داده‌های ارسالی را با استفاده از Validator بررسی کند: کنترلر (UserController.cs): public class UserController : Controller { private readonly IValidator<User> _validator; public UserController(IValidator<User> validator) { _validator = validator; } [HttpPost] public IActionResult Register(User model) { var result = _validator.Validate(model); if (result.IsValid) { // منطق برای پردازش داده‌ها TempData["Message"] = "ثبت نام با موفقیت انجام شد"; return RedirectToAction("Index"); } foreach (var error in result.Errors) { ModelState.AddModelError(error.PropertyName, error.ErrorMessage); } return View(model); } } ویو برای نمایش خطاها ویو را طوری تنظیم کنید که پیام‌های خطای اعتبارسنجی Fluent Validation را نمایش دهد: ویو (Register.cshtml): @model YourNamespace.Models.User <h1>ثبت نام</h1> <form asp-action="Register" method="post"> <div> <label asp-for="UserName"></label> <input asp-for="UserName" /> <span asp-validation-for="UserName"></span> </div> <div> <label asp-for="Email"></label> <input asp-for="Email" /> <span asp-validation-for="Email"></span> </div> <div> <label asp-for="Password"></label> <input asp-for="Password" type="password" /> <span asp-validation-for="Password"></span> </div> <button type="submit">ثبت نام</button> </form> نتیجه با این روش، می‌توانید از FluentValidation برای اعتبارسنجی داده‌های ورودی استفاده کنید و پیام‌های خطای مناسبی به کاربر نمایش دهید.
Scaffolding چیست
در ASP.NET Core MVC، Scaffolding فرآیندی است که به شما کمک می‌کند کدهای ابتدایی و پایه‌ای برای عملیات CRUD (ایجاد، خواندن، به‌روزرسانی و حذف) را به صورت خودکار تولید کنید. با استفاده از Scaffolding، می‌توانید به سرعت کنترلرها و ویوهای مورد نیاز برای کار با مدل‌های داده‌ای خود را ایجاد کنید، بدون اینکه نیاز به نوشتن کدهای تکراری داشته باشید. مزایای استفاده از Scaffolding: صرفه‌جویی در زمان: به جای نوشتن دستی کدهای CRUD، می‌توانید به سرعت کدهای اولیه را تولید کنید. کاهش خطاها: کدهای تولید شده توسط Scaffolding معمولاً استاندارد و بدون خطا هستند. آسانی در توسعه: توسعه‌دهندگان تازه‌کار می‌توانند به سرعت با ساختار پروژه آشنا شوند و کدهای اولیه را تولید کنند. مراحل استفاده از Scaffolding: فرض کنید یک مدل به نام Product دارید و می‌خواهید کنترلر و ویوهای مربوط به آن را با استفاده از Scaffolding ایجاد کنید. 1. نصب ابزارهای مورد نیاز: مطمئن شوید که ابزارهای مورد نیاز برای Scaffolding نصب شده‌اند. می‌توانید از NuGet Package Manager برای نصب ابزارهای مربوطه استفاده کنید: dotnet add package Microsoft.VisualStudio.Web.CodeGeneration.Design dotnet add package Microsoft.EntityFrameworkCore.Design 2. ایجاد مدل (Product.cs): public class Product { public int Id { get; set; } public string Name { get; set; } public decimal Price { get; set; } } 3. ایجاد DbContext (ApplicationDbContext.cs): public class ApplicationDbContext : DbContext { public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options) { } public DbSet<Product> Products { get; set; } } 4. اجرای Scaffolding: از خط فرمان یا ترمینال برای اجرای دستور Scaffolding استفاده کنید. این دستور یک کنترلر و ویوهای مربوط به مدل Product ایجاد می‌کند: dotnet aspnet-codegenerator controller -name ProductsController -m Product -dc ApplicationDbContext --relativeFolderPath Controllers --useDefaultLayout --referenceScriptLibraries 5. تنظیم مسیرها: در فایل Program.cs یا Startup.cs، مسیرها را تنظیم کنید: var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllersWithViews(); builder.Services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection"))); var app = builder.Build(); app.UseRouting(); app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); }); app.Run(); نتیجه: با اجرای Scaffolding، یک کنترلر به نام ProductsController و ویوهای مرتبط با عملیات CRUD برای مدل Product ایجاد می‌شود. این کدهای تولید شده می‌توانند به سرعت شما را در شروع کار با مدل‌ها و پایگاه داده‌ها یاری کنند.
شاید برای شما هم پیش بیاد که یک پروژه بگیرید و بعضی از قسمتها مخصوصا در پنل admin یه بخش هایی وجود دارد که فقط عملیات CRUD (افزودن، ویرایش ، حذف و جزئیات) را می خواهیم برایش انجام دهیم و بیزینس خواصی ندارد فقط یه لیستی نمایش بدهیم ویرایش کند به لیست یک مقدار جدید اضافه کند و یا آنها را حذف کند می توانیم از Scaffolding استفاده کنیم که یک سیستم که ویژوال استودیو در اختیار ما قرار داده که با استفاده از Scaffolding می توانیم کدها را به صورت خودکار جنریت Generate کنیم و نیازی نباشد کدهای اون قسمت را خودمان بنویسیم
وقتی می خواهیم یک کنترلر برای مدل ایجاد کنیم سه تا حالت مختلف می توانم ایجاد کنم گزینه اول empty یک کنترلر خالی و یک اکشن index ایجاد می کند و گزینه دوم که یک کنترلر برای من ایجاد میکند که چهار عمل اصلی را داخلش پیاده سازی کرده 1- لیست 2- افزودن 3- ویرایش 4- حذف و گزینه سوم هم با همه این ها با استفاده از entity framwork پیاده سازی می کند ما از گزینه دوم استفاده می کنیم در قسمت بعدی نام کنترلر را انتخاب می کنیم و گزینه Add را می زنیم می بینید که تمامی اکشن مورد نیاز عملیات CRUD را ایجاد کرده
تا اینجا ScaffoldingUserController مورد نیاز نوشته شد از ایجا می خواهیم ویوها را هم بنویسیم از آنجا که خروجی را ببینیم چیز تمیزی نشان دهم من یک Repository می نویسم که یک داده های فیک برای ما برگردونه using AspNetCoreMvc.Models.Entities; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace AspNetCoreMvc.Models.Repositories { public class UserRepository { private readonly List<Users> _users = new List<Users>(); public UserRepository() { _users.Add(new Users { Age = 25, Email = "info@bugeto.net", Id = 1, Mobile = "09121000000", Name = "میثم" }); _users.Add(new Users { Age = 30, Email = "info@bugeto.net", Id = 2, Mobile = "09122000000", Name = "سامیار" }); } public List<Users> Get() { return _users; } public Users Find() { return _users.FirstOrDefault(); } } } در Repository یک لیست از user ایجاد کردم که در متد سازنده این کلاس دو تا مقدار دوتا user اضافه کردم چون هنوز دیتابیس نداریم دیتابیس را شبیه سازی کردم و داده ها را برگشت بدهم در پایین دو تا متد دارم یکیش get و دیگری Find متد get لیست تمام user را برگشت می دهد و متد Find برای جستجو استفاده می شود
من در کنترلر ScaffoldingUserController در ایجا یک نمونه از UserRepository ایجاد کنم و در متد سازنده مقدار دهی کنیم private readonly UserRepository _userRepository; public ScaffoldingUserController() { _userRepository = new UserRepository(); }
برای اینکه لیست user ها را ببینم به صورت Scaffolding این را ایجاد کنم میتوانم روی اکشن کلیک راست کنم و ایجا Add view را بزنم Razor View را انتخاب می کنیم در قسمت Template چه نوع view را ایجاد می کنید به صورت پیش فرض empty خالی هست که یک view خالی برای ما ایجاد می کند و ما می خواهیم یک view از نوع List ایجاد کنیم وقتی لیست را انتخاب می کنیم Model class برای ما ایجاد می شود و از ایجا مدل Model ما را می خواهد در ایجا مدل را از نوع کلاس User انتخاب می کنیم در گزینه Create as a Partial View که یک Partial View ایجاد می شود و گزینه بعدیReference script Libraries را بزنید script های مورد نیاز لیست یا هر نوع view را ایجاد کنیم اون script به view ها اضافه می شوند و گزینه آخر Layout های مورد نظر انتخاب کنیم و اگر Add را بزنیم view ایجاد می شود
کدهای یک view را برسی می کنیم @model IEnumerable<WebApplication4.Models.Entities.Users> @{ ViewData["Title"] = "Index"; } <h1>Index</h1> <p> <a asp-action="Create">Create New</a> </p> <table class="table"> <thead> <tr> <th> @Html.DisplayNameFor(model => model.Id) </th> <th> @Html.DisplayNameFor(model => model.Name) </th> <th> @Html.DisplayNameFor(model => model.Age) </th> <th> @Html.DisplayNameFor(model => model.Phone) </th> <th> @Html.DisplayNameFor(model => model.Mobile) </th> <th> @Html.DisplayNameFor(model => model.Email) </th> <th></th> </tr> </thead> <tbody> @foreach (var item in Model) { <tr> <td> @Html.DisplayFor(modelItem => item.Id) </td> <td> @Html.DisplayFor(modelItem => item.Name) </td> <td> @Html.DisplayFor(modelItem => item.Age) </td> <td> @Html.DisplayFor(modelItem => item.Phone) </td> <td> @Html.DisplayFor(modelItem => item.Mobile) </td> <td> @Html.DisplayFor(modelItem => item.Email) </td> <td> @Html.ActionLink("Edit", "Edit", new { id = item.Id }) | @Html.ActionLink("Details", "Details", new { id = item.Id }) | @Html.ActionLink("Delete", "Delete", new { id = item.Id }) </td> </tr> } </tbody> </table> توضیحات: @model IEnumerable<WebApplication4.Models.Entities.Users>: این خط مشخص می‌کند که مدل ویو یک لیست از کاربران (Users) است. @{ ViewData["Title"] = "Index"; }: این خط عنوان صفحه را به "Index" تنظیم می‌کند. <h1>Index</h1>: این خط عنوان صفحه را در یک عنصر <h1> نمایش می‌دهد. <a asp-action="Create">Create New</a>: این خط یک لینک ایجاد می‌کند که به اکشن Create هدایت می‌شود. <table class="table">: این خط یک جدول HTML با کلاس CSS "table" ایجاد می‌کند. <thead>...</thead>: این بخش شامل سرستون‌های جدول است. برای هر خاصیت از مدل (Id, Name, Age, Phone, Mobile, Email) یک سرستون ایجاد می‌شود. <tbody>...</tbody>: این بخش شامل بدنه جدول است که برای هر کاربر در مدل، یک ردیف (<tr>) ایجاد می‌کند. @foreach (var item in Model) { ... }: این حلقه foreach برای هر کاربر در مدل یک ردیف جدول ایجاد می‌کند. @Html.DisplayFor(modelItem => item.Property): این متد مقدار هر خاصیت (Id, Name, Age, Phone, Mobile, Email) را در سلول‌های جدول نمایش می‌دهد. @Html.ActionLink("Edit", "Edit", new { id = item.Id }): این لینک به اکشن Edit با شناسه (id) کاربر مورد نظر هدایت می‌شود. @Html.ActionLink("Details", "Details", new { id = item.Id }): این لینک به اکشن Details با شناسه (id) کاربر مورد نظر هدایت می‌شود. @Html.ActionLink("Delete", "Delete", new { id = item.Id }): این لینک به اکشن Delete با شناسه (id) کاربر مورد نظر هدایت می‌شود. این کد به شما یک لیست از کاربران را در یک جدول HTML نمایش می‌دهد، با قابلیت ایجاد، ویرایش، مشاهده جزئیات و حذف هر کاربر.
بیایید کدهای کنترلر ScaffoldingUserController را بررسی کنیم تا بفهمیم هر بخش چه کاری انجام می‌دهد. کلیات: این کنترلر از Controller ارث‌بری می‌کند و شامل اکشن‌هایی برای عملیات‌های CRUD (ایجاد، خواندن، به‌روزرسانی، حذف) برای مدل User است. UserRepository برای دسترسی به داده‌های User استفاده می‌شود. کد کامل: using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using WebApplication4.Models.Repositories; namespace WebApplication4.Controllers { public class ScaffoldingUserController : Controller { private readonly UserRepository _userRepository; public ScaffoldingUserController() { _userRepository = new UserRepository(); } // GET: ScaffoldingUserController public ActionResult Index() { return View(_userRepository.Get()); } // GET: ScaffoldingUserController/Details/5 public ActionResult Details(int id) { return View(_userRepository.Find()); } // GET: ScaffoldingUserController/Create public ActionResult Create() { return View(); } // POST: ScaffoldingUserController/Create [HttpPost] [ValidateAntiForgeryToken] public ActionResult Create(IFormCollection collection) { try { return RedirectToAction(nameof(Index)); } catch { return View(); } } // GET: ScaffoldingUserController/Edit/5 public ActionResult Edit(int id) { return View(_userRepository.Find()); } // POST: ScaffoldingUserController/Edit/5 [HttpPost] [ValidateAntiForgeryToken] public ActionResult Edit(int id, IFormCollection collection) { try { return RedirectToAction(nameof(Index)); } catch { return View(); } } // GET: ScaffoldingUserController/Delete/5 public ActionResult Delete(int id) { return View(_userRepository.Find()); } // POST: ScaffoldingUserController/Delete/5 [HttpPost] [ValidateAntiForgeryToken] public ActionResult Delete(int id, IFormCollection collection) { try { return RedirectToAction(nameof(Index)); } catch { return View(); } } } } جزئیات اکشن‌ها: Index: روش HTTP: GET توضیحات: این اکشن لیستی از کاربران را از _userRepository.Get() می‌گیرد و به ویو می‌فرستد. Details: روش HTTP: GET توضیحات: این اکشن جزئیات یک کاربر خاص را با id از _userRepository.Find() می‌گیرد و به ویو می‌فرستد. Create (GET): روش HTTP: GET توضیحات: این اکشن ویوی ایجاد یک کاربر جدید را برمی‌گرداند. Create (POST): روش HTTP: POST توضیحات: این اکشن داده‌های ارسال شده از فرم را دریافت می‌کند و تلاش می‌کند تا کاربر جدیدی ایجاد کند. اگر موفقیت‌آمیز باشد، به اکشن Index هدایت می‌شود، در غیر این صورت، ویوی ایجاد را دوباره نمایش می‌دهد. Edit (GET): روش HTTP: GET توضیحات: این اکشن جزئیات یک کاربر خاص را با id از _userRepository.Find() می‌گیرد و به ویو برای ویرایش می‌فرستد. Edit (POST): روش HTTP: POST توضیحات: این اکشن داده‌های ارسال شده از فرم ویرایش را دریافت می‌کند و تلاش می‌کند تا اطلاعات کاربر را به‌روزرسانی کند. اگر موفقیت‌آمیز باشد، به اکشن Index هدایت می‌شود، در غیر این صورت، ویوی ویرایش را دوباره نمایش می‌دهد. Delete (GET): روش HTTP: GET توضیحات: این اکشن جزئیات یک کاربر خاص را با id از _userRepository.Find() می‌گیرد و به ویو برای حذف می‌فرستد. Delete (POST): روش HTTP: POST توضیحات: این اکشن داده‌های ارسال شده از فرم حذف را دریافت می‌کند و تلاش می‌کند تا کاربر را حذف کند. اگر موفقیت‌آمیز باشد، به اکشن Index هدایت می‌شود، در غیر این صورت، ویوی حذف را دوباره نمایش می‌دهد.
نکات: برای هر اکشن POST، از [HttpPost] و [ValidateAntiForgeryToken] استفاده شده است تا اطمینان حاصل شود که درخواست‌ها از منابع معتبری ارسال شده‌اند و امنیت فرم‌ها حفظ می‌شود. UserRepository به عنوان یک منبع داده برای دسترسی به کاربران استفاده شده است.