
آشنایی با Model Binding Attributes در ASP.NET CORE
در این آموزش قصد آشنایی با Model Binding Attributes را داریم. در ASP.NET Core، شما میتوانید رفتار Model Binding را با استفاده Attributes ها سفارشی کنید. Model Binding فرآیندی است که طی آن ASP.NET Core دادههای ورودی (مانند دادههای فرم، کوئری استرینگ و … ) را به پارامترهای مربوط به اکشنها یا به مدلهای دادهای متصل میکند. شما میتوانید از Attribute های مختلفی برای سفارشی کردن این فرآیند استفاده کنید. برخی از این اتربیوت ها عبارتند از:
اتربیوت [Bind]
به شما امکان میدهد که رفتار 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] به ما کمک میکند تا کنترل دقیقتری بر روی Model Binding داشته باشیم. و از Bind داده های غیر ضروری یا حساس در فرآیند Model Binding جلوگیری کنید.
- استفاده از اتربیوت [Bind] میتواند امنیت برنامه را افزایش دهد زیرا از Bind دادههای غیر ضروری یا حساس به مدلها ما جلوگیری میکند.
نکته مهم: از اتربیوت Bind برای اجبار به پر بودن یا خالی نبودن فیلد های یک مدل استفاده نمیشود. بلکه هدف این است مشخص کنیم چه اطلاعاتی توسط سیستم پر شود و چه اطلاعاتی توسط کاربر ارسال شود.
اتربیوت [BindRequired]
تضمین میکند یک 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 از منابع غیر Body مانند کوئری استرینگ و فرمها کاربرد دارد. برای منابع Body ، میتوان از ویژگیهای اعتبارسنجی مانند [Required] استفاده کرد.
- این اتربیوت بیشتر زمانی مفید است که بخواهید اطمینان حاصل کنید که ورودیهای ضروری حتماً در درخواستهای کاربر وجود داشته باشند.
اتربیوت [BindNever]
به 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; }
}- اتربیوت [BindNever] برای جلوگیری از Bind مقادیر ورودی توسط کاربر استفاده میشود. و برای مقادیری که نباید توسط کاربر تنظیم شوند، مانند ID یا مقادیر حساس، مفید است.
- این اتربیوت به Model Binding اجازه میدهد تا فقط مقادیر مورد نظر را از ورودی کاربر دریافت کند و مقادیر مهم یا حساس را نادیده بگیرد.
اتربیوت […FROM]
این اتربیوت به شما امکان میدهند که مشخص کنید دادههای ورودی از کدام بخش درخواست باید گرفته شوند.
- اتربیوت [FromQuery]: برای دریافت دادهها از کوئری استرینگ.
- اتربیوت [FromRoute]: برای دریافت دادهها از پارامترهای مسیریابی.
- اتربیوت [FromForm]: برای دریافت دادهها از دادههای فرم.
- اتربیوت [FromBody]: برای دریافت دادهها از بدنۀ درخواست.
- اتربیوت [FromHeader]: برای دریافت دادهها از هدرهای
- اتربیوت HTTP. [FromServices]: برای دریافت دادهها از سرویسهایDependency Injection.
public IActionResult Index3( [FromForm] Person person)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
return Ok(person);
}- استفاده از این اتربیوت به شما امکان میدهد که منابع دادههای ورودی را به صورت دقیق کنترل کنید.
- ترکیب این اتربیوت ها در یک اکشن امکانپذیر است. و میتوانید از منابع مختلف دادهها را بگیرید.
- با استفاده از این ویژگیها میتوانید کنترل بهتری بر روی ورودیهای کاربر داشته باشید و برنامه خود را امنتر کنید.
سورس کد Model Binding Attributes
شما میتوانید سورس کد کامل Model Binding Attributes را از طریق گیت مشاهده کنید و یا اگر گیت کار نمیکنید، به راحتی آن را به صورت فایل فشرده (ZIP) دانلود کنید. فایلهای دانلودی شامل تمام بخشهای پروژه است و میتوانید آن را روی سیستم خود اجرا یا تغییر دهید.









![اتربیوت [Bind] در ModelBinding](https://tehranit.net/wp-content/uploads/2024/06/ModelBinding-720x405.jpg)






















با سلام
در مثال آخرتون FromRoute استقاده کردید این برای زمانی که در مدل id استقاده کردید جواب میدهد من UserId داشتم اینجا id را از روت نخوند چون هم اسم id نبود و صفر برگرداند. اینجا چکار میشه کرد؟ آیا باید همیشه برای مدل هایمان id استفاده کرد و از اسامی مثل UserId اجتناب کرد؟
در ASP.NET Core زمانی که از [FromRoute] استفاده میشود، مقداردهی پارامترها بر اساس نام آنها در URL انجام میگیرد. اگر نام پارامتر داخل اکشن مثلاً UserId باشد ولی در route مقداردهی مانند {id} تعریف شده باشد، چون نامها متفاوتاند، مقدار بهدرستی به پارامتر منتقل نمیشود و مقدار پیشفرض (مثلاً ۰ برای int) برمیگردد. برای رفع این مشکل یا باید نام پارامتر را با route هماهنگ کرد، یا از ویژگی Name در [FromRoute(Name = "id")] استفاده کرد. بنابراین نیازی نیست همیشه از نام id استفاده شود، فقط کافیست بین route و پارامتر هماهنگی وجود داشته باشد.