محتویات سایت
        برچسب های محبوب 








 
   آموزش MVC - قسمت ششم - اعتبارسنجی با استفاده از DataAnnotaions
  این مقاله درباره چگونگی کنترل اطلاعات وارد شده توسط کاربر در صفحات MVC می باشد.
   ASP.NET MVC
   ۱۷۷۰۶
   این مقاله حاوی فایل ضمیمه نمی باشد
   امیر مددی
   ۱۳۹۰/۶/۱
نسخه قابل چاپ نسخه قابل چاپ

اعتبار سنجی مدل با استفاده از 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  مایکرسافت نگاهی بیندازید و بخشهای مختلف آن را برای خود آنالیز کنید. 
برچسب های مرتبط