اعتبارسنجی داده ها در محیط MVVM
جمعه 13 آذر 1394این مقاله دستکاری زیر لایه GUI را برای تایید کاربر ورودی توضیح خواهد داد. اعتبارسنجی توسط صفت های اعتبارسنجی بر روی ویژگی آیتم ها تعریف می شود. هر قاعده اعتبارسنجی پیاده سازی یک صفت است که به یک ویژگی نسبت داده شده است.
در این مقاله یک کلاس پایه ای را که می تواند برای اعتبارسنجی داده ها در محیط MVVM استفاده شود توضیح خواهیم داد . از برنامه ایجاد شده در مقاله قبل استفاده میکنیم و Small Application Framework را گسترش میدهیم.
این مقاله دستکاری زیر لایه GUI را برای تایید کاربر ورودی توضیح خواهد داد . اعتبارسنجی توسط صفت های اعتبارسنجی بر روی ویژگی آیتم ها تعریف می شود. هر قاعده اعتبارسنجی پیاده سازی یک صفت است که به یک ویژگی نسبت داده شده است. در این مقاله Model Data را در کلاس DisplayItem که یک View Model برای آیتم است کپسوله سازی میکنیم.
Data View Model
دیاگرام زیر کلاس UserDisplayItem را به عنوان ViewModel برای UserRow نشان میدهد.
. لایه Application ، و DataGridRow : ردیفی در کنترل grid است که شامل مدل نمایش کاربر به عنوان DataContext آن است .
. لایه ViewModel ، و UserDisplayItem : داده کاربر با ویژگی های نام و نام خانوادگی ارائه می شود که صفت های اعتبارسنجی به آن انتساب داده شده است.
. لایه DataModel ، و UserRow : کلاس مدلی را ارائه می دهد که شامل داده های کاربر است.
. SmallApplicationFramework و DataViewModelBase : کلاس پایه ای View model که شامل شیء داده هایی (نمونه ای از UserRow) که نمایش داده می شوند. این کلاس شامل منطق اعتبارسنجی می شود که خطاها را با استفاده از رابط IDateErroeInfo اطلاع می دهد.
بعضی اعتبار سنجی ها به شرح زیر می باشد:
1. Data grid control : اعتبارسنجی می تواند مستقیما روی داده ها انجام شود. ویژگی داده ها باید برای کار کردن اعتبارسنجی بروز رسانی یا تنظیم شوند ،
2. Edit form : یک Modal است ، هنگامی که بوسیله فشردن کلید OK بسته می شود، داده ها بروز رسانی میشوند. در این مورد داده ها به صورت موقت در view model ذخیره می شوند و در آخر در شیء داده ای بکار می رود. اعتبارسنجی روی ویژگی های View Model اجرا می شود.
3. داده های پیچیده یا محاسبه شده نمایش داده می شوند. در این نمونه data field یکی از اعضای data Item نیست اما از ویژگی های دیگر بدست می آید. نمایش و اعتبارسنجی داده ها باید بوسیله یک کلاس view model اجرا شوند .
کلاس DisplayItem از رابط IDateErroInfo برای اطلاع خطاها استفاده میکند. رابط یا Interface دو ویژگی دارد.
// Gets an error message indicating what is wrong with this object. string Error { get; } // Gets the error message for the property with the given name. string this[string columnName] { get; }
اعتبارسنجی داده از ویژگی دوم استفاده میکند. WPF به صورت خودکار این ویژگی را برای همه ویژگی هایی که با کنترل های GUI در ارتباط هستند فراخوانی میکند و ValidatesOnDataErrors=true در اتصال تنظیم می شود. یک خطای متنی زمانی که ویژگی شامل داده های نامعتبر باشد بازگردانده می شود. GUI خطاها را به روش های مختلف نشان می دهد. در اینجا به صورت Tool tip نمایش داده می شود.
اعتبارسنجی داده
تعریف اعتبارسنجی داده ها با انتساب صفت های اعتبارسنجی به ویژگی های View Model انجام می شود.
[Required(ErrorMessage = "Role name must be given")] [UniqueRoleName(ErrorMessage = "Role name must be unique")] public string Name { get; set; }
NET Framework. صفتهای اعتبارسنجی چندگانه را پیشنهاد می دهد. مانند صفت Required در بالا. این صفتها در System.ComponentModel.DataAnnotations وجود دارند . UniqueRoleName یک صفت سفارشی است که نام نقش موجود را چک میکند.
علاوه بر این ، اعتبارسنجی می تواند بوسیله View Model بدون صفتها انجام شود. . چهارچوب Validation یک متد مجازی را فراخوانی میکند که می تواند برای ویژگی اعتبارسنجی استفاده شود.
بازیابی داده ها و بروزرسانی
بازیابی داده ، داده ها را از مدل درون View Model کپی میکند. بروزرسانی داده ، مدل داده ای را با مقادیری از View Model بروزرسانی میکند. کلاس DataViewModelBase قابلیتی برای اجرای خودکار این روندها ارائه داده است .
روند بازیابی داده زمانی انجام می شود که مدل داده ای به ویژگی مدل نمایشی DataObject انتساب داده شده است. این قابلیت مدل را برای پیدا کردن ویژگی مشترکی با View Model بررسی میکند. داده ها را زمانی که بتوان از مدل گرفت و در مدل نمایشی تنظیم کرد کپی می کند. سیگنال View Model که بازیابی داده ها را شروع میکند به View Model اجازه بازیابی مقادیر بدون ویژگی مانند مقادیر حساب شده را می دهد. بوسیله بازنویسی متد RetrievingModelData() تنظیم می شود.
روند بروزرسانی ، داده ها را از مدل نمایشی در مدل کپی میکند. UpdateModeOnPropertyChange به صورتی تنظیم می شود که مدل هر بار یک مقدار ویژگی تغییر کرد یا نه بروزرسانی شود. آپدیت خودکار زمانی که داده ها در یک Dialog نمایش داده می شوند و داده ها باید آپدیت شوند می تواند نامطلوب باشد .
متدهای مجازی اضافی منطق تخصصی ای را برای بازیابی و بروزرسانی فراهم میکنند. این متدها عبارتند از :
protected virtual void RetrievingModelData() { } protected virtual void RetrievedModelData() { } protected virtual void UpdatingModelData() { } protected virtual void UpdatedModelData() { }
برنامه دو View دارد که شامل کنترل grid برای کاربران و نقش ها است. هر View ، برای خود یک View Model دارد که شامل منطق View می باشد. هر View Model شامل مجموعه ای قابل مشاهده حاوی آیتم های نمایشی است. مجموعه هنگام شروع نمایش پر می شودو هنگام اضافه شدن یا حذف شدن داده ها بروزرسانی می شود.
در مثال ما هر دو کنترل ها دارای اعتبارسنجی هستند. کنترل grid کاربران ، نام و نام خانوادگی را نیاز دارد. و در کنترل نقش ها ، نام نقش باید داده شود. نام نقش باید منحصر بفرد باشد.
نمونه سازی از کلاس DataViewModelBase
DataViewModelBase یک کلاس پایه ای است اگر چه بخشی از Small Application Framework می باشد. یک کلاس عمومی شامل نمونه مدل داده ای است. دیاگرام زیر نشان می دهد چگونه داده های UserRow و RoleRow بوسیله کلاسهای UserDisplayItem و RoleDisplayItem کپسوله سازی می شوند . نمونه داده بوسیله ویزگی DataObject قابل دسترس است.
اعتبارسنجی در چهارچوب WPF ایجاد می شود. هر کنترل به یک ویژگی View moel مانند زیر در ارتباط است:
<DataGridTextColumn Header="Name" Binding="{Binding Name, ValidatesOnDataErrors=True, UpdateSourceTrigger=LostFocus}"/>
ValidatesOnDataErrors اعتبارسنجی را فعال میکند و UpdateSourceTrigger تعریف میکند که چه موقع داده معتبر است.
اعتبارسنجی داده در ویژگی پیاده سازی می شود.
public string this[string propertyName] { get { // Data validation implementation } }
قدم های اعتبارسنجی به صورت زیر می باشد :
1. ویژگی ها برای معتبر بودن چک شود. منطق کاری می تواند اعتبارسنجی ویژگی ها را لغو کند. می تواند بوسیله بازنویسی متد PropertyMustBeValidated تنظیم شود.
2. اگر ویژگی های داده شده معتبر باشد، پیاده سازی View Model درخواست می شود. می توان آن را بوسیله بازنویسی متد PropertyIsValid(string propertyName, out string errorMessage) بدست آورد.
3. گرفتن همه صفتهای اعتبارسنجی از ویژگی های داده شده با استفاده از انعکاس . ویژگی ها برای اجرا cache میشوند.
4. تکرار اعتبارسنجی و جمع اوری نتایج خطاها. پیگیری خطاها در یک دیکشنری که شامل خطاهای احتمالی از تمام ویژگی های تایید شده است. اگر پیگیری خطا شامل no errors شود ، view Model معتبر است .
اعتبارسنجی سفارشی
اعتبارسنجی سفارشی را می توان با ایجاد یک کلاس جدید که از ValidationAttribute مشتق شده است پیاده سازی کرد . منطق در متد IsValid قرار خواهد گرفت.
public class UniqueRoleNameAttribute : ValidationAttribute { protected override ValidationResult IsValid(object value, ValidationContext validationContext) { ValidationResult validationResult = ValidationResult.Success; var roleItem = validationContext.ObjectInstance as RoleDisplayItem; if (roleItem != null) { if (RoleBusinessLogic.IsRoleNameUnique(value as string, roleItem.DataObject)) { validationResult = new ValidationResult(this.ErrorMessage); } } return validationResult; } }
کد بالا منحصر بفرد بودن اعتبارسنجی نام نقش را نشان می دهد. نام نقشی که کاربر وارد کرده است در مقدار پارامتر موجود است. محتوای اعتبارسنجی شامل منبعی به RoleDisplayeItem است . کلاس ValidationResult شامل خطاهای اعتبارسنجی می شود. اگر اعتبارسنجی درست بود ، آنگاه نتیجه اعتبارسنجی مقدار null خواهد بود که توسط ویژگی static ValidationResult.Success تعریف شده است .
- WPF
- 2k بازدید
- 2 تشکر