در این آموزش قصد آشنایی با Model Binding Attributes را داریم. در ASP.NET Core، شما میتوانید رفتار Model Binding را با استفاده Attributes ها سفارشی کنید. Model Binding فرآیندی است که طی آن ASP.NET Core دادههای ورودی (مانند دادههای فرم، کوئری استرینگ و … ) را به پارامترهای مربوط به اکشنها یا به مدلهای دادهای متصل میکند.
شما میتوانید از Attribute های مختلفی برای سفارشی کردن این فرآیند استفاده کنید. برخی از این اتربیوت ها عبارتند از:
به شما امکان میدهد که رفتار Model Binding خود را سفارشیسازی کنید. با استفاده از این اتربیوت، میتوانید مشخص کنید که کدام Property یک مدل باید در فرآیند Model Binding در نظر گرفته شوند و کدام Property نادیده گرفته شوند.
فرض کنید مدلی به نام Person ایجاد کردیم.
public class Person
{
public int id { get; set; }
public string name { get; set; }
public string family { get; set; }
public int age { get; set; }
}
و در اکشن خود مشخص میکنیم، فرایند Model Binding فقط برای پراپرتی های name,family,age انجام شود.
public IActionResult Index([Bind("age,name,family")]Person person)
{
if (!ModelState.IsValid) {
return BadRequest(ModelState);
}
return Ok(person);
}
حال تمامی پراپرتی ها را برای اکشن ارسال میکنیم. ولی پراپرتی id برابر با ۰ میشود با اینکه مقدار ۱۱ را برای آن ارسال کردیم. چون مشخص کردیم که اجازه بایند ندارد.
نکته مهم: از اتربیوت Bind برای اجبار به پر بودن یا خالی نبودن فیلد های یک مدل استفاده نمیشود. بلکه هدف این است مشخص کنیم چه اطلاعاتی توسط سیستم پر شود و چه اطلاعاتی توسط کاربر ارسال شود.
تضمین میکند یک Property خاص باید حتماً در دادههای ورودی وجود داشته باشد. اگر این خاصیت در ورودی موجود نباشد، Model Binding شکست میخورد و یک Model Error ایجاد میشود. این ویژگی بیشتر در سناریوهایی مفید است که وجود یک داده خاص برای عملکرد صحیح برنامه ضروری است.
روش اول : فرض کنید باید حتما مقدار Age حتما در دادههای ورودی وجود داشته باشد.
public IActionResult Index2(int id,string name,string family,[BindRequired]int age)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
return Ok("ok");
}
روش دوم : افزودن اتربیوت در کلاس مدل
public class Person
{
public int id { get; set; }
public string? name { get; set; }
public string? family { get; set; }
[BindRequired]
public int age { get; set; }
}
به Model Binding دستور میدهد که یک Property خاص را نادیده بگیرد. به عبارت دیگر، این ویژگی تضمین میکند که مقادیر ورودی کاربر برای این Property خاص به هیچ وجه bind نمیشوند. این ویژگی زمانی مفید است که بخواهید اطمینان حاصل کنید که برخی از خصوصیات مدل توسط کاربر تغییر نمیکنند و فقط باید از داخل کد سرور مقداردهی شوند.
روش اول : فرض کنید مقدار id باید نادیده گرفته شود و توسط سیستم پر شود.
public IActionResult Index2([BindNever]int id,string name,string family,int age)
{
id = 335;
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
return Ok("ok");
}
روش دوم : افزودن اتربیوت در کلاس مدل
public class Person
{
[BindNever]
public int id { get; set; }
public string? name { get; set; }
public string? family { get; set; }
public int age { get; set; }
}
این اتربیوت به شما امکان میدهند که مشخص کنید دادههای ورودی از کدام بخش درخواست باید گرفته شوند.
public IActionResult Index3( [FromForm]Person person)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
return Ok(person);
}