اعتبار سنجی مدل با استفاده از DataAnnotaions
حتما به یاد دارید که در صفحات قدیمی aspx/ascx در ویژال استودیو، ابزارهای
Validation وجود داشت مثل Asp:RequiredFieldValidator که باعث می شدند اطلاعات
وارد شده توسط کاربر ارزیابی شود و داده ها با قالب (فرمت ) صحیح برای ذخیره در
بانک طلاعاتی ارسال شوند . این کار در MVC با استفاده از Model Validation انجام
می شود . در واقع با این کار، کنترل می کنیم که کاربران وقتی اطلاعاتی در فرم وارد
می کنند، این اطلاعات از لحاظ قالب داده، صحیح باشند، مثلا ایمیل با فرمت صحیح وارد
شود، جایی که قرار است عدد وارد ، حروف وارد نشود و ....
در MVC اعتبار سنجی با استفاده از DataAnnoations صورت می پذیرد. در واقع می
خواهیم :
1- اعتبارسنجی در هر دو سمت Server و Client انجام شود.
2- قاعده DRY را رعایت کنیم ( Don't Repeat Yourself ) و این بدان معناست که
کد ارزیابی را تکرار نکنیم، در یک جا بنویسیم و تمامی بخشها ( Controller ، Model و
View ) آن را بپذیرند.
از آنجایی که در MVC برای هر فرمی ابتدا یک کلاس ایجاد می کنیم ، اعتبارسنجی نیز در
هنگام ساختن Model ها (کلاس ها) ، اعمال می شود . برای این کار فضای نام ( name
space ) زیر را به کلاسی که قصد داریم بسازیم اضافه می کنیم :
using System.ComponentModel.DataAnnotaions;
حال قبل از تعریف هر فیلد در مدل، ارزیابی خود را انجام می دهیم .
متداولترین عبارتهای ارزیابی عبارتند از :
Required : مشخص می کند که ورود فیلد اجباری است
Range: برای تعیین محدوده ای از اعداد
StringLenght: برای تعیین طول یک رشته
RegularExpression: برای ارزیابی عبارات منظم مثل ایمیل
مثال زیر یک کلاس ساده را نشان می دهد که شامل نام ،فامیل ، سن و ایمیل است .
در مثال فوق فیلدهای FirstName و LastName اجباری هستند و در صورت عدم ورود پیغامی
مناسب نمایش داده خواهد شد و طول هر کدام حداکثر 50 کارکتر می تواند باشد. فیلد
Ageنیز اجباری و بین صفر تا 120 می تواند باشد. فیلد ایمیل نیز اجباری و برای آن یک
قاعده منظم تعریف شده است . (برای درک بهتر قواعد منظم
این مقاله را بخوانید و یا #Regular Expression in C را جستجو کنید)
خروجی این فرم هنگامی که شما کاربر اطلاعات نامعتبر وارد می کند به شکل زیر است:
اما کار دیگری که لازم است انجام شود این است که در Controller مربوطه ، در Action
ی که قرار است اطلاعات ذخیره شود ، قبل از ذخیره اطلاعات ، بررسی شود که آیا
اطلاعات وارد شده مطابق با مدل ( کلاس ) هست یا نه ؟ برای اینکار از شرط (if(modelState.IsValid استفاده می کنیم. مثال زیر را ببینید:
نکته جالب اینکه وقتی ما در مدل ، از اعتبارسنجی استفاده می کنیم ، در هنگام ساختن
View از روی Model ( که به آن Strongly Type View می گویند ) ، به صورت اتوماتیک ،
متد validationMessageFor از کلاس Html فراخوانی می شود که باعث چاپ همان پیغامی می
شود که ما در مدل برای آن فیلد نوشته ایم :
برای اجرای اعتبارسنجی در سمت Client باید رفرنسهای MicrosoftAjax.js و
MicrosoftMVCValidation.js را نیز به view خود اضافه کنید :
اعتبار سنجی سفارشی :
بسیاری از اوقات لازم است که یک اعتبارسنجی سفارشی را پیاده سازی کنید که تا
بتوانید فیلدی را آنگونه که می خواهید، بسنجید. برای این کار باید کلاسی از نوع
اعتبارسنجی مورد نظر مشتق کنید و base constructor آن را دوباره نویسی کنید.
مثال زیر نحوه ارزیابی فیلد email را توسط RegularExpression بازتعریف
می کند :
نمایش ندادن یا تغییر نام برخی فیلدها :
بسیاری از اوقات شما نمی خواهید در View یک فیلد به کاربر نشان داده شود،
مثلا اگر کاربری مشغول وارد کردن اطلاعات خود برای ثبت نام است،شما نمی خواهید
اجازه دهید که فیلد Id را خودش وارد کند ، چون باید توسط بانک اطلاعاتی تعیین
شود. برای این کار در هنگام تعریف مدل ، آن فیلد (ها ) را با عبارت
[BindExclude="fieldName" ] مشخص می کنیم و قبل از فیلد هم از عبارت
[ScaffoldColumn(false)] استفاده می کنیم .
گاهی اوقات نیز می خواهیم نام دیگری برای فیلد خود در هنگام نمایش در View
انتخاب کنیم . برای تغییر نام نمایشی فیلد از displayName استفاده می کنیم. مثال زیر از پروژه معروف Music Store است که می توانید آن را بعنوان یک مثال خوب دانلود کنید و مطالعه نمایید.
lazy-Load در EntityFramwork :
اگر از Entityframework برای ارتباط با بانک اطلاعاتی استفاده می کنید ، با
اضافه کردن عبارت Virtual به تعریف فیلد، امکان استفاده از lazy-load را در
صورت نیاز فراهم می آوریم . (اگر از EntityFramework استفاده نمی کنید، از این قسمت صرفنظر کنید )
بسیار خوب، در این مقاله با روش اعتبارسنجی اطلاعات فرم آشنا شدیم. تقریبا تمامی پروژه های وب به این اعتبارسنجی ها نیاز دارند. به مثال Music Store مایکرسافت نگاهی بیندازید و بخشهای مختلف آن را برای خود آنالیز کنید.