اعتبارسنجی داده ها در محیط MVVM

جمعه 13 آذر 1394

این مقاله دستکاری زیر لایه GUI را برای تایید کاربر ورودی توضیح خواهد داد. اعتبارسنجی توسط صفت های اعتبارسنجی بر روی ویژگی آیتم ها تعریف می شود. هر قاعده اعتبارسنجی پیاده سازی یک صفت است که به یک ویژگی نسبت داده شده است.

اعتبارسنجی داده ها در محیط  MVVM

در این مقاله یک کلاس پایه ای را که می تواند برای اعتبارسنجی داده ها در محیط  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  تعریف شده است .

فایل های ضمیمه

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

نویسنده 3355 مقاله در برنامه نویسان
  • WPF
  • 2k بازدید
  • 2 تشکر

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

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