Model Binding در MVC

سه شنبه 26 مرداد 1395

در این مقاله با تعریف Model Binding و نحوه ی کارکرد آن آشنا خواهید شد, و همچنین نحوه ی سفارشی سازی رفتار Model Binding توسط صفت ها و نحوه ی Bind کردن داده ی فرمت شده در بدنه ی درخواست را یاد خواهید گرفت.

Model Binding در MVC

معرفی Model Binding

Model Binding در ASP.NET Core MVC داده ها را از درخواست های Http به پارامترهای متد action انتقال می دهد.

پارامترها شاید مانند string، integer یا Float از نوع Simple ، و یا شاید از نوع Complex باشند.این یک ویژگی بسیار خوب از MVC می باشد زیرا نگاشت کردن  داده ی ورودی به یک مکان مورد نظر ،بدون در نظر گرفتن سایز یا پیچیدگی داده ، اغلب یک عمل تکراری می باشد.MVC این مشکل را با نادیده گرفتن Binding حل می کند.بنابراین توسعه دهندگان مجبور نخواهند بود یک نسخه ی مربوط به یک کد مشابه که فقط کمی تفاوت دارد را  در هر برنامه ای دوباره بازنویسی کنند.نوشتن دوباره ی متن وتبدیل آن به نوع دیگر کار خسته کننده ای می باشد و ممکن است با خطا مواجه شود.

چگونه Model Binding کار می کند؟

زمانی که MVC یک درخواست HTTP دریافت می کند ، مسیر را برای یک متد  action خاص مربوط به یک Controller تعیین می کند. این عمل تعیین می کند که کدام متد  action  براساس آنچه که در داده ی مسیر وجود دارد اجرا شود، سپس مقادیر را از درخواست HTTP به متد action مربوط به پارامترها متصل (bind) می کند.برای مثال URL زیر را بررسی کنید:

http://contoso.com/movies/edit/2

قالب مسیر URL بالا به شکل زیر است:

{controller=Home}/{action=Index}/{id?}

در این مثال "movies/edit/2 " به Controller به نام Movies،و به action به نام Edit هدایت می شود.همچنین در اینجا پارامتر اختیاری به اسم id را می پذیرد. کدی که برای متد action می باشدباید به شکل زیر باشد:

public IActionResult Edit(int? id)

نکته : رشته در URL Route حساس به حروف بزرگ و کوچک نیستند .

MVC تلاش خواهد کرد که درخواست های داده (request data) را به پارامترهای Action  بوسیله نام آنها ، bind کند . MVC با استفاده از نام هر پارامتر به دنبال مقدار آن پارامتر خواهد گشت و نام آن قابلیت تنظیم شدن دارد . در مثال بالا ، تنها پارامتر action موجود ، id است ، که MVC مقدار را با همین نام در مقدارbind ، route خواهد کرد . در مجموع ، برای route کردن مقادیر ، MVC با استفاده از قسمت های مختلف درخواست داده ها را bind خواهد کرد و این امر در مجموعه منظم رخ خواهد داد . در زیر یک لیستی از منابع داده ها  وجود دارد  ، که Model binding را نشان می دهند :
1. Form Values : اینها مقادیر فرم هستند که با استفاده از متد POST از طریق HTTP منتقل میشوند .
2. Route Value : مجموعه ای از مقادیر route  که توسط routing ارائه میشوند .
3. Query String : این ، قسمتی از URL است .

نکته : Form Values ، Route Value و Query String همگی به عنوان name-stored ذخیره می شوند .

زمانی که model binding درخواست یک کلید با نام id را میکند  و در فرم ما هیچ فیلدی با نام id وجود ندارد ، آن به route value منتقل می شود و  در آنجا به دنبال کلید مورد نظر می گردد . در مثال ما ، این یک مسابقه است . binding رخ می دهد ، و مقدار به یک integer با مقدار 2 تبدیل میشود .  درخواست مشابهی از (Edit(string id استفاده می کند که آن را تبدیل به یک رشته میکند با مقدار "2" .

در این مثال ما از datatype های ساده استفاده کرده ایم. در MVC این datatype ساده نمیتواند هر چیزی باشد ، یک type اصلی یا یک type با یک تبدیل کننده به  رشته (string type converter) . اگر پارامتر action Method یک کلاس همانند Movie باشد ، که هم دارای type های ساده و هم دارای type های پیچیده  به عنوان properties است ، MVC's Model binding به زیبایی هر چه تمام تر این را اداره و مدیریت میکند.
این برای پیمایش مشخصات typeهای پیچیده از انعکاس و بازگشت استفاده خواهد کرد برای همخوانی داشتن یا نداشتن .  Model Binding به دنبال الگو خواهد گشت .
parameter_name.property_name برای bind کردن مقادیر در properties است . اگر مقداری را که همخوانی نداشته باشد ، در فرم  پیدا نکند ، فقط برای اضافه کردن نام propertiy تلاش خواهد کرد .
برای اینگونه type ها همانند  Model binding ، Collection Type به دنبال چیزی میگردد که با [parameter_name[index یا فقط [index]  ، همخوانی داشته باشد .  model binding همانند Dictionary type عمل می کند ، و تا زمانی که Simple type است ،  به دنبال [parameter_name[key یا [key] می رود . کلید هایی که پشتیبانی می شوند با نام فیلد ها مطابقت دارند و tag helper برای model type های یکسان تولید می شود . این مقدار round-tripping را فعال میسازد ، بنابراین برای راحتی کاربران فیلدهای فرم با ورودی هایی که کاربر وارد کرده است ، پر می ماند .

برای رخ دادن binding در کلاس ،  باید یک سازنده (Constructor) پیش فرض عمومی و اعضا برای bound شدن باید عمومی قابل نوشتن (public writeable) باشند . زمانی که model binding رخ میدهد ، نمونه ای که از کلاس ساخته شده است از سازنده عمومی پیش فرض  استفاده میکند ، سپس  properties میتوانند تنظیم شوند .

زمانی که یک پارامتر bound میشود ، model binding جستجوی برای مقدار با همچین نامی را متوقف میکند و به سراغ bind کردن پارامتر بعدی می رود . اگر binding ناموفق بود ، MVC خطایی را نمایش نخواهد داد . شما میتوانید با استفاده از کوئری زدن برای model state ، مشخصه ModelState.IsValid را چک کنید .

نکته : هر Entry در مشخصه  Controller ModelState ، یک ModelStateEntry  که شامل یک Error property است .

در مجموع ، در اینجا datatype های خاصی وجود دارد که MVC در هنگام استفاده از آنها باید توجه داشته باشد :

• <IFormFile , IEnumerable<IformFile : یک یا چند فایل آپلود شده که قسمتی از درخواست HTTP است .

• CancelationToken : در لغو فعالیت برای Controller های آسنکرون استفاده می شود .

این typeها میتوانند در action parameters یا در propertiyهای درون کلاس ، bound شوند .
زمانی که model binding کامل است ، validation رخ می دهد . model binding پیش فرض نقش بسیار موثری در انجامِ سناریو های توسعه دارد . همچنین قابلیت توسعه پذیری دارد به همین دلیل اگر یک نیاز منحصر به فرد دارید ، براحتی میتوانید یک رفتار سفارشی برای آن تعریف کنید .

•  سفارشی کردن رفتارهای model binding با استفاده از صفت ها :

MVC شامل صفت های مختلفی است که شما میتوانید بطور مستقیم از رفتار پیش فرض
model binding برای اتصال آن ، به منابع مختلف استفاده کنید . برای مثال ، زمانی که از binding برای proprtyها استفاده میکنم ، یا اگر صلاح این است که این کار اصن رخ ندهد این کار را میتوانید با استفاده از صفت های [BindReqired] یا [BindNever] ، انجام دهید . متناوبا ، میتوان داده های منبع را دوباره باز نویسی کرد و منبع داده model binder را نشان داد . در زیر لیستی از attribute های model binding است .

• [BindRequired] : این صفت ، زمانی که binding نتواند رخ دهد یک model state error اضافه می کند .

• [BindNever] :این را بیان دارد که ، هیچ وقت این را  با Bind ، Model Binding  نکنید .

• [FromForm] , [FromQuery], [FromRoute],[FromHeader] : : برای نشان دادن منبع دقیق
binding که میخواهید تایید کنید ، از اینها استفاده کنید .

• [FromServices] : از این صفت برای depency injection ، برای bind کردن پارامترهای سرویس استفاده می کنند .
• [FromBody] : از configured formatters برای bind کردن داده از بدنه درخواست ها استفاده می شود . formatter بر اساس نوع محتوای درخواست ها انتخاب میشود .

• [ModelBinder] : از این صفت برای بازنویسی   (Model Binder ، (override پیش فرض ، نام و منبع binding استفاده میکنیم .


  زمانی که شما قصد بازنویسی رفتار های پیش فرض model binding را دارید ، attributes ابزارهای  بسیار مفیدی هستند.


• Binding formatted data from the request body :
داده های درخواستی در فرمت های مختلف میتواند بیایند ، JSON , XML و کلی موارد دیگر . زمانی که شما از صفت [FromBody] برای نشان دادن این مطلب که شما قصد bind کردن پارامتری در داده ی بدنه درخواست دارید ، MVC از مجموعه ای از پیکربندیهای مرتب برای مدیریت داده درخواستی بر اساس نوع داده محتوای آن . بطور پیش فرض MVC دارای یک کلاس با نام JsonInputFormatter ّرای مدیریت داده های JSON دارد ، اما میتوانید formatters اضافی برای مدیریت XML و بقیه formatter های سفارشی ، اضافه کنید .

نکته : JsonInputFormatter ، فرمتر پیش فرض است و این پایه و اساس Json.net می باشد.

input formatters ، ASP.Net ها را بر اساس نوغ داده header آنها و نوع پارامترهای آن انتخاب میکند . مگر اینکه وجود یک ویژگی اعمال شده به آن مشخص باشد . در غیر این صورت اگر شما قصد استفاده از فایل های XML یا فرمت های دیگر را دارید باید آن را در فایل  Configure ، Startup.cs کنید اما قبل از آن شاید شما مجبور شوید تا با استفاده از
Refrence ،  NuGetای را فراهم کنید تا microsoft.aspnetcore.mvc.formatters.xml داشته باشید .

کد Startup شما باید چیزی شبیه زیر باشد :

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc()
       .AddXmlSerializerFormatters();
}


کد داخل فایل Startup.cs شامل یک متد ConfigureServices با یک آرگومان Services می باشد .که شما میتوانید برای ساختن سرویس ، دربرنامه های  ASP.Net از آن استفاده کنید .  در این مقاله ، ما یک
XML Formatter به عنوان سرویس اضافه میکنیم که MVC آن را برای برنامه فراهم میکند . آرگومان
options به متد AddMVC  پاس داده میشود که این اجازه را به شما میدهد که فیلتر ها ، فرمتر ها و سایر تنظیمات سیستم را اضافه و مدیریت کند .


سپس صفت Consume را در کلاس Controller یا متد Action را برای کار کردن با فرمتی که مد نظر دارید ،  تایید کنید .

آموزش asp.net mvc

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید