یک نمونه خروجی برای مدل User که شامل اعتبارسنجی و نمایش نام فیلدها به فارسی است:
مدل (User.cs):
public class User
{
[Required]
[Display(Name = "نام کاربری")]
public string UserName { get; set; }
[Required]
[EmailAddress]
[Display(Name = "ایمیل")]
public string Email { get; set; }
[Required]
[Display(Name = "رمز عبور")]
public string Password { get; set; }
}
ویو (Register.cshtml):
@model YourNamespace.Models.User
<h1>ثبت نام</h1>
<form asp-action="Register">
<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>
@section Scripts {
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}
نتیجه خروجی در مرورگر:
وقتی این ویو را در مرورگر مشاهده کنید، فرم به این شکل خواهد بود:
برچسبها (label) و پیامهای خطا (span) به فارسی نمایش داده میشوند.
اگر کاربر فیلدهای اجباری را پر نکند یا ایمیل نامعتبری وارد کند، پیامهای خطای مناسبی نمایش داده میشوند.
با استفاده از مدل User و ویو Register که در بالا توضیح داده شد، وقتی کاربر فرم را پر کند و ارسال کند، نتیجهای مانند زیر خواهید داشت:
نام کاربری: اگر این فیلد پر نشده باشد، پیام "لطفا نام کاربری خود را وارد کنید" نمایش داده میشود.
ایمیل: اگر ایمیل معتبر نباشد، پیام "لطفا یک آدرس ایمیل معتبر وارد کنید" نمایش داده میشود.
رمز عبور: اگر رمز عبور وارد نشده باشد، پیام "لطفا رمز عبور خود را وارد کنید" نمایش داده میشود.
این مثال به شما کمک میکند تا فرمهای خود را با استفاده از Data Annotations اعتبارسنجی کنید و پیامهای خطا را به زبان فارسی نمایش دهید.
اگر کاربر فایل JavaScript را حذف کند و اعتبارسنجی سمت کلاینت (Client-Side Validation) غیر فعال شود، اعتبارسنجی سمت سرور (Server-Side Validation) همچنان برای اطمینان از صحت دادهها ضروری است. اعتبارسنجی سمت سرور برای بررسی دادهها در سمت سرور پس از ارسال فرم انجام میشود و از وارد شدن دادههای نادرست یا مخرب به سیستم جلوگیری میکند.
چگونه اعتبارسنجی سمت سرور را پیادهسازی کنیم:
مدل با اعتبارسنجی: مدل را با استفاده از Data Annotations برای تعریف قوانین اعتبارسنجی آماده کنید. این اعتبارسنجیها در سمت سرور اعمال میشوند.
public class User
{
[Required(ErrorMessage = "لطفا نام کاربری خود را وارد کنید")]
[StringLength(100, ErrorMessage = "نام کاربری نباید بیش از 100 کاراکتر باشد")]
public string UserName { get; set; }
[Required(ErrorMessage = "لطفا ایمیل خود را وارد کنید")]
[EmailAddress(ErrorMessage = "لطفا یک ایمیل معتبر وارد کنید")]
public string Email { get; set; }
[Required(ErrorMessage = "لطفا رمز عبور خود را وارد کنید")]
[StringLength(100, ErrorMessage = "رمز عبور نباید بیش از 100 کاراکتر باشد")]
public string Password { get; set; }
}
کنترلر برای پردازش دادهها: کنترلر را طوری تنظیم کنید که دادههای ارسالی را اعتبارسنجی کند و در صورت عدم اعتبار، پیامهای خطا را به کاربر نمایش دهد.
public class UserController : Controller
{
[HttpPost]
public IActionResult Register(User model)
{
if (ModelState.IsValid)
{
// منطق برای پردازش دادهها
TempData["Message"] = "ثبت نام با موفقیت انجام شد";
return RedirectToAction("Index");
}
// اگر دادهها معتبر نبودند، ویو با پیامهای خطا بازگردانده میشود
return View(model);
}
}
ویو برای نمایش خطاها: ویو را طوری تنظیم کنید که پیامهای خطای اعتبارسنجی سمت سرور را نمایش دهد.
@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>
@section Scripts {
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}
با این روش، حتی اگر JavaScript غیر فعال باشد یا فایلهای اعتبارسنجی جاوااسکریپت حذف شوند، اعتبارسنجی سمت سرور از ورود دادههای نادرست جلوگیری میکند و پیامهای خطا به کاربر نمایش داده میشود.
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 برای اعتبارسنجی دادههای ورودی استفاده کنید و پیامهای خطای مناسبی به کاربر نمایش دهید.
در 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 نمایش میدهد، با قابلیت ایجاد، ویرایش، مشاهده جزئیات و حذف هر کاربر.