این مقاله به تشریح ارائه دهندگان ارزش سفارشی در MVC و کاربرد آنها می پردازد. Value Provider اجزایی هستند که داده ها را به کلاسورهای مدل می خورند. تغذیه داده ها به معنای نصب داده ها به Model binder برای استفاده بیشتر در سطح عمل است.
این چارچوب حاوی چند ارائه دهنده ارزش داخلی به نامهای FormValueProvider، RouteDataValueProvider، QueryStringValueProvider و HttpFileCollectionValueProvider است که دادهها را از Request.Form، Request.QueryString، Request.Files و RouteData.Values واکشی میکنند.
این ارائهدهندههای ارزش به ترتیبی که ثبت شدهاند فراخوانی میشوند و بنابراین، ارائهدهندهای که زودتر ثبتشده است، اولین فرصت را پیدا میکند. ما به راحتی می توانیم مدل را از اتصال به داده های یک Value Provider خاص محدود کنیم.
در این مقاله نحوه ایجاد ارائه دهندگان ارزش سفارشی را خواهیم دید که یک مقدار را از یک کوکی واکشی می کنند و کلاسورهای مدل را در سطح عمل ارسال می کنند.
در پایین سطح، من یک کنترلر ایجاد کرده ام که یک عمل به عنوان یک شاخص اعلام شده است. هنگامی که عملکرد Index با استفاده از GET فراخوانی می شود، یک کوکی به مرورگر به نام "Id" با مقدار "E001" به آن اختصاص داده می شود.
![کوکی](https://www.c-sharpcorner.com/UploadFile/97fc7a/smart-working-with-custom-value-providers-in-Asp-Net-mvc/Images/cookie.jpg)
هنگامی که فرم ارسال می شود [HttpPost] یک عمل شاخص دوباره فراخوانی می شود و مقدار کوکی به طور خودکار به پارامتر Id در روش شاخص POST اختصاص داده می شود. اما چگونه؟
![چگونه](https://www.c-sharpcorner.com/UploadFile/97fc7a/smart-working-with-custom-value-providers-in-Asp-Net-mvc/Images/how.jpg)
هر ارائه دهنده مقدار یک رابط IValueProvider را پیاده سازی می کند که دو روش دارد که در تصویر زیر نشان داده شده است:
![ارائه دهنده ارزش پیاده سازی می کند](https://www.c-sharpcorner.com/UploadFile/97fc7a/smart-working-with-custom-value-providers-in-Asp-Net-mvc/Images/value provider implements.jpg)
متد ContainsPrefix توسط binder مدل فراخوانی می شود تا مشخص شود که آیا ارائه دهنده مقدار داده های یک پیشوند معین را دارد یا خیر. متد GetValue مقداری را برای یک کلید داده مشخص برمیگرداند یا اگر ارائهدهنده داده مناسبی نداشته باشد، null را برمیگرداند. در اینجا پیاده سازی هر دو روش همانطور که در تصویر زیر نشان داده شده است:
![مواد و روش ها](https://www.c-sharpcorner.com/UploadFile/97fc7a/smart-working-with-custom-value-providers-in-Asp-Net-mvc/Images/methods.jpg)
در تصویر نشان داده شده در بالا، روش ContainsPrefix بررسی می کند که آیا پارامتر ارسال شده در کوکی ذخیره شده است (یا مقداری که کاربر در پارامترهای درخواست/پاسخ دیگر ثبت کرده است) و true یا false را برمی گرداند. در متد GetValue، مقداری را از مجموعه کوکی برای کلید ارسال شده برمی گرداند (در مورد ما Id است).
اکنون زمان ثبت نام ارائهدهنده ارزش از طریق کارخانهها است تا آنها را وادار به نصب دادهها در کلاسور مدل کنیم. ما باید یک کارخانه ایجاد کنیم تا CustomValueProvider خود را با استخراج از کلاس انتزاعی ValueProviderFactory ثبت کنیم. کارخانه حاوی یک روش GetValueProvider است که در آن باید ارائهدهنده ارزش سفارشی خود را نمونهسازی کنیم و آن را برگردانیم.
اکنون باید CustomValueProviderFactory را در مجموعه ValueProviderFactories.Factories در رویداد Application_Start در Global.asax.cs ثبت کنیم، همانطور که در تصویر زیر نشان داده شده است:
![CustomValueProviderFactory](https://www.c-sharpcorner.com/UploadFile/97fc7a/smart-working-with-custom-value-providers-in-Asp-Net-mvc/Images/CustomValueProviderFactory.jpg)
حالا F5 رو میزنم و برنامه رو اجرا میکنم.
![برنامه را اجرا کنید](https://www.c-sharpcorner.com/UploadFile/97fc7a/smart-working-with-custom-value-providers-in-Asp-Net-mvc/Images/run the application.jpg)
بیایید برنامه را اجرا کنیم و نکات را گام به گام مورد بحث قرار دهیم تا مقدار را از CustomValueProvider دریافت کنیم.
مرحله 1: به محض اجرای برنامه، مقدار کوکی را همانطور که در تصویر زیر نشان داده شده است ثبت می کند:
![مقدار کوکی](https://www.c-sharpcorner.com/UploadFile/97fc7a/smart-working-with-custom-value-providers-in-Asp-Net-mvc/Images/cookie value.jpg)
مرحله 2: مقادیر مورد نیاز را پر کنید و دکمه ok را فشار دهید، لطفا تصویر زیر را مشاهده کنید:
![مقادیر مورد نیاز را پر کنید](https://www.c-sharpcorner.com/UploadFile/97fc7a/smart-working-with-custom-value-providers-in-Asp-Net-mvc/Images/Fill the required values.jpg)
مرحله 3: کلاس CustomValueProvideFactory را برای نمونه سازی CustomValueProvider همانطور که در تصویر زیر نشان داده شده است فراخوانی می کند:
![کد](https://www.c-sharpcorner.com/UploadFile/97fc7a/smart-working-with-custom-value-providers-in-Asp-Net-mvc/Images/Code.jpg)
مرحله 4: در زمان اتصال مدل، بررسی های DefaultModelBinder با ارائه دهندگان مقدار مشخص می کند که آیا آنها می توانند مقداری را برای پارامتر Id با فراخوانی متد ContainsPrefix برگردانند یا خیر. اگر هیچ یک از ارائه دهندگان ارزش ثبت شده نمی توانند برگردانند، از طریق CustomValueProvider بررسی می کند که آیا چنین پارامتری ذخیره شده است یا خیر و اگر بله، مقدار را برمی گرداند. لطفاً به اسکرین شات زیر مراجعه کنید:
![مقدار پارامتر](https://www.c-sharpcorner.com/UploadFile/97fc7a/smart-working-with-custom-value-providers-in-Asp-Net-mvc/Images/parameter Value.jpg)
مرحله 5: مرحله نهایی در روش post action زمانی است که مقدار کوکی را از CustomValueProvides بازیابی می کند.
![روش پس از عمل](https://www.c-sharpcorner.com/UploadFile/97fc7a/smart-working-with-custom-value-providers-in-Asp-Net-mvc/Images/post action method.jpg)
نکته مهم: اگر پارامتر موجود در متد عمل را تغییر دهیم، به دلیل عدم تطابق، مقداری از ارائه دهنده مقدار سفارشی ثبت شده پیدا نمی کند و null را برمی گرداند. همچنین می توانید چندین مقدار را از ارائه دهندگان ارزش بازیابی کنید. لطفاً نمونه برنامه پیوست شده را پیدا کنید.
لطفا به تصویر زیر مراجعه کنید:
![نمونه برنامه](https://www.c-sharpcorner.com/UploadFile/97fc7a/smart-working-with-custom-value-providers-in-Asp-Net-mvc/Images/sample application.jpg)
جادوی ارائه دهندگان ارزش به پایان رسیده است.
![ارائه دهندگان](https://www.c-sharpcorner.com/UploadFile/97fc7a/smart-working-with-custom-value-providers-in-Asp-Net-mvc/Images/Providers.jpg)
امیدوارم از این کار لذت برده باشید و ممکن است به شما در ادامه مسیر کمک کند.