میتوانید از @RenderPartial برای رندر کردن یک پارشیال ویو داخل یک سکشن استفاده کنید. معمولاً از await برای رندر کردن پارشیال ویوها به شکل غیرهمزمان استفاده میشود. با استفاده از await میتوانید به صورت بهتری از منابع سرور استفاده کنید.
مثال:
برای قرار دادن پارشیال ویوی _ValidationScriptsPartial در سکشن Scripts، به صورت زیر عمل کنید:
@section Scripts {
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}
توضیحات:
await Html.RenderPartialAsync("_ValidationScriptsPartial"):
این متد به صورت غیرهمزمان پارشیال ویو _ValidationScriptsPartial را رندر میکند. استفاده از await برای رندر کردن پارشیال ویوها توصیه میشود زیرا به بهرهوری بهتر از منابع سرور کمک میکند.
به این ترتیب، اسکریپتهای اعتبارسنجی به درستی در سکشن Scripts بارگذاری میشوند و میتوانند در فرمهای شما استفاده شوند.
در ASP.NET Core، Data Annotations یکی از راههای محبوب برای اعتبارسنجی مدلها است. این Attributeها به شما امکان میدهند تا قواعد اعتبارسنجی را در سطح مدل تعریف کنید. در زیر لیستی از رایجترین Attributeهای اعتبارسنجی و توضیحات مربوط به هر یک آورده شده است:
1. [Required]
این Attribute مشخص میکند که یک فیلد اجباری است و نباید خالی باشد.
[Required(ErrorMessage = "این فیلد ضروری است")]
public string Name { get; set; }
2. [StringLength]
این Attribute طول مجاز یک رشته را مشخص میکند.
[StringLength(100, ErrorMessage = "طول رشته نباید بیش از 100 کاراکتر باشد")]
public string Description { get; set; }
3. [Range]
این Attribute محدوده مجاز برای یک عدد را مشخص میکند.
[Range(1, 100, ErrorMessage = "مقدار باید بین 1 تا 100 باشد")]
public int Age { get; set; }
4. [EmailAddress]
این Attribute مشخص میکند که فیلد باید یک آدرس ایمیل معتبر باشد.
[EmailAddress(ErrorMessage = "لطفاً یک آدرس ایمیل معتبر وارد کنید")]
public string Email { get; set; }
5. [Compare]
این Attribute برای مقایسه دو فیلد استفاده میشود. معمولاً برای اعتبارسنجی رمزهای عبور استفاده میشود.
[Compare("Password", ErrorMessage = "رمزهای عبور باید یکسان باشند")]
public string ConfirmPassword { get; set; }
6. [RegularExpression]
این Attribute برای اعتبارسنجی با استفاده از یک الگوی خاص (Regular Expression) استفاده میشود.
[RegularExpression(@"^\d{4}-\d{2}-\d{2}$", ErrorMessage = "تاریخ باید به فرم YYYY-MM-DD باشد")]
public string Date { get; set; }
7. [Phone]
این Attribute مشخص میکند که فیلد باید یک شماره تلفن معتبر باشد.
[Phone(ErrorMessage = "لطفاً یک شماره تلفن معتبر وارد کنید")]
public string PhoneNumber { get; set; }
8. [CreditCard]
این Attribute برای اعتبارسنجی شماره کارت اعتباری استفاده میشود.
[CreditCard(ErrorMessage = "لطفاً یک شماره کارت اعتباری معتبر وارد کنید")]
public string CreditCardNumber { get; set; }
9. [Url]
این Attribute مشخص میکند که فیلد باید یک URL معتبر باشد.
[Url(ErrorMessage = "لطفاً یک URL معتبر وارد کنید")]
public string Website { get; set; }
10. [Custom Validation]
شما همچنین میتوانید Attributeهای سفارشی خود را برای قواعد خاص اعتبارسنجی ایجاد کنید.
public class MyCustomValidationAttribute : ValidationAttribute
{
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
if (/* شرط معتبر بودن */)
{
return ValidationResult.Success;
}
return new ValidationResult("پیغام خطای سفارشی");
}
}
public class MyModel
{
[MyCustomValidation]
public string MyProperty { get; set; }
}
این Attributeها به شما کمک میکنند تا قواعد اعتبارسنجی مورد نیاز خود را به راحتی و به صورت متمرکز در مدلهای خود تعریف کنید. اگر نیاز به توضیحات بیشتری دارید یا پرسش دیگری در این زمینه دارید، بفرمایید!
در واقع attribute phone برای شماره تلفن بینالمللی استفاده میشود و برای اطمینان از صحت و مناسبیت شمارهها، میتوانید از ابزارهایی مانند RegularExpression استفاده کنید. این ابزارها به شما کمک میکنند تا شمارههای تلفن بینالمللی را با قالب مناسبی ارزیابی کنید.
این الگو به شما اجازه میدهد که شمارههای تلفن همراه ایرانی را با پیششمارههای ۰ و +۹۸ شناسایی کنید و مطمئن شوید که قالب آنها درست است.
توضیحات الگو:
(\+98|0)? : این بخش نشان میدهد که شماره میتواند با +۹۸ یا ۰ شروع شود و این قسمت اختیاری است.
9 : نشاندهنده این است که شماره تلفن با ۹ شروع میشود (تمام شمارههای موبایل در ایران با ۹ شروع میشوند).
\d{9} :
به این معناست که بعد از ۹، باید ۹ رقم دیگر باشد.
استفاده در مدل:
میتوانید از این الگو در مدل خود استفاده کنید:
public class ContactModel
{
[Required(ErrorMessage = "لطفا شماره تلفن خود را وارد کنید")]
[RegularExpression(@"(\+98|0)?9\d{9}", ErrorMessage = "لطفا یک شماره تلفن معتبر وارد کنید")]
public string PhoneNumber { get; set; }
}
با این کار، شماره تلفنهای ورودی با الگوی مورد نظر تطبیق داده میشوند و در صورت نادرست بودن قالب، پیام خطای مشخصشده نمایش داده میشود.
Attribute Display در ASP.NET Core MVC و Entity Framework به شما اجازه میدهد تا نامهای قابل فهمتری برای فیلدهای مدلها در ویوها نمایش دهید. با استفاده از Display, میتوانید نامهایی که به کاربران نشان داده میشود را تغییر دهید بدون اینکه نام فیلدهای مدل را تغییر دهید.
مثال:
فرض کنید یک مدل به نام User دارید و میخواهید نام فیلدها را در ویوها تغییر دهید:
public class User
{
[Required]
[Display(Name = "نام کاربری")]
public string UserName { get; set; }
[Required]
[Display(Name = "ایمیل")]
public string Email { get; set; }
[Required]
[Display(Name = "رمز عبور")]
public string Password { get; set; }
}
استفاده در ویو:
وقتی که از این مدل در ویو استفاده میکنید، نامهای تعریف شده در Display به کاربران نمایش داده میشود:
@model YourNamespace.Models.User
<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>
نتیجه:
با استفاده از Display, نامهای فیلدها به کاربران به صورت فارسی یا هر نامی که مشخص کردهاید نمایش داده میشوند، مانند "نام کاربری"، "ایمیل" و "رمز عبور"، حتی اگر نام فیلدها در مدل به زبان انگلیسی باشد.
این کار به بهبود خوانایی و تجربه کاربری کمک میکند و از استفاده از نامهای داخلی فیلدها در رابط کاربری جلوگیری میکند.
یک نمونه خروجی برای مدل 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 برای جستجو استفاده می شود