قواعد المشاركة في المنتدى

(قسم الاعلانات) الموضوع:افضل شركه ديكورات فلل – كرياتف جروب للديكو للاتصال 01203903309 بواسطة: (emo rafy) :: (قسم الاعلانات) الموضوع:نطيطات زحاليق هوائية بواسطة: (الغرووووب) :: (أخبار التكنولوجيا) الموضوع:انضم الآن مجانا إلى أقوى ألعاب كرة القدم بواسطة: (رفيف الحياه) :: (أخبار التكنولوجيا) الموضوع:تطبيق مكتبتي بواسطة: (رفيف الحياه) :: (أخبار التكنولوجيا) الموضوع:تطبيق مكتبتي بواسطة: (رفيف الحياه) :: (قسم الاعلانات) الموضوع:مؤسسة وحدة المشاريع لعزل خزانات المياه بواسطة: (Marketing Magic) :: (قسم الاعلانات) الموضوع:مؤسسة وحدة المشاريع لتسليك مجارى المطبخ والحمام بواسطة: (Marketing Magic) :: (قسم الاعلانات) الموضوع:شركة وحدة المشاريع للكشف عن تسربات المياه بواسطة: (Marketing Magic) :: (قسم الاعلانات) الموضوع:شركة وحدة المشاريع لعزل الاسطح بواسطة: (Marketing Magic) :: (قسم التطوير والاقتراحات) الموضوع:وان تاتش بواسطة: (محمود ناصر) :: (قسم الاعلانات) الموضوع:إعلانات مبوبة مجانية في السعودية - سوق الخليجي بواسطة: (ضياء روحي) :: (قسم التطوير والاقتراحات) الموضوع:اكوام بواسطة: (محمود ناصر) :: (أخبار التكنولوجيا) الموضوع:حل أي سؤال من كتب المواد الهندسية والعلمية خطوة بخطوة بواسطة: (رفيف الحياه) :: (أخبار التكنولوجيا) الموضوع:حل أي سؤال من كتب المواد الهندسية والعلمية خطوة بخطوة بواسطة: (رفيف الحياه) :: (أخبار التكنولوجيا) الموضوع:حمل التطبيق الآن سواء اندرويد او ابل بواسطة: (رفيف الحياه) :: (أخبار التكنولوجيا) الموضوع:مصدر الخضار والفواكه موثوقة المصدر بواسطة: (رفيف الحياه) :: (قسم الاعلانات) الموضوع:افضل موقع لتحميل الاغاني mp3 مجانا بدون اعلانات بواسطة: (كريم يونس) :: (قسم الاعلانات) الموضوع:برنامج مبيعات باللغة العربية بواسطة: (alaatamer1) :: (قسم الاعلانات) الموضوع:معدات مصانع الاعلاف بواسطة: (ساره حمدي) :: (قسم الاعلانات) الموضوع:افضل خدمات المنزل مع عاملاتنا بواسطة: (زينب محمدي)

المواضيع المثبته: (Oracle قسم قواعد البيانات أوراكل) الموضوع:تنصيب أوراكل 8i النسخة الشخصية على ويندوز XP بواسطة: (راحـل) :: (منتدى Microsoft SQL Server) الموضوع:ما المقصود بتقنية replication بواسطة: (SQL Student) :: (منتدى Microsoft Excel) الموضوع:open office بواسطة: (ramies) :: (منتدى أجاكس(Asynchronous JavaScript and XML)) الموضوع:إستخدام Web Services مع ASP.NET AJAX بواسطة: (يوسف جميل جادالله) :: (منتدى الكتب الالكترونية) الموضوع:كتاب كامل من جزئين يشرح access وبالتفصيل وقواعد البيانات وبالتفصيل بواسطة: (m.i.a.r) :: (منتدى Microsoft Excel) الموضوع:دروس إكسل و شرح الدوال و تقنيات متقدمة بواسطة: (صهيب جاويش) :: (منتدى مبرمجي Microsoft Visual VB.NET) الموضوع:الادوات الجديده Controls فى الدوت نت بواسطة: (alaa gomaa) :: (منتدى أنظمة الشبكات وأمنها) الموضوع:الشبكات الحاسوبية ..Computer Network.. بواسطة: (مرحبا الساع) :: (قسم الدعم الفني) الموضوع:هل تريد التحكم بجهازك كأنك محترف بواسطة: (ياسر جمال) :: (منتدى برمجة الألعاب) الموضوع:اعلان هام بواسطة: (مصطفي البارودي) :: (منتدى Microsoft SQL Server) الموضوع:يومياً أسئلة sql server مجاناً بواسطة: (m.atassi) :: (منتدى مبرمجي ASP.NET) الموضوع:Visual Web Developer 2010 Express بواسطة: (يوسف جميل جادالله) :: (منتدى مبرمجي Microsoft Visual C#.NET) الموضوع:موسوعة الأكواد بواسطة: (fmo_82) :: (منتدى Microsoft Visual Basic) الموضوع:كيفية إنشاء نظام شؤون الموظفين من الصفر بواسطة: (zoubicom) :: (منتدى أجاكس(Asynchronous JavaScript and XML)) الموضوع:نبذة مختصرة عن تعريف تقنية أجاكس بواسطة: (عبدالله جابر شقليه) :: (قسم الدروس و الدورات) الموضوع:تعلم : كيف تجعل البرنامج سيت اب بواسطة: (alaa gomaa) :: (منتدى برمجة التقارير) الموضوع:اصنع تقريرك في اقل من دقيقه واستغني عن الكريستال ريبورت بواسطة: (mero_make) :: (منتدى مبرمجي لغة جافا JAVA) الموضوع:شرح أكواد الجافا بواسطة: (الردادي) :: (منتدى Microsoft Visual Basic) الموضوع:Home Administrator Project بواسطة: (zoubicom) :: (منتدى Microsoft Visual Basic) الموضوع:دورة التعامل مع Data Report باستخدام ADODC ( شرح بالصور ) بواسطة: (Max Bayne)

إضافة رد إضافة موضوع جديد

> تعرف إلى الواصفة ValidationAttribute وطريقة استخدامها
Bookmark and Share
تقييم الموضوع Label معدل التقيم:0
مشاركةالسبت,16/جمادى الثانية/1439 هـ,09:07 صباحاً
المشاركة #1

الرتبة في المنتدى:رقيب

أيقونة المجموعة

المجموعة: الأعضاء
المشاركات: 12
سجل في:الخميس,06/جمادى الثانية/1428 هـ,12:33 صباحاً
الدولة:سوريا
رقم العضوية: 28836



هناك عدة طرق للتحقق من قيم نموذج model منها
v باستخدام IValidatableObject
v باستخدام الواصفة ValidationAttribute
v الطريقة الأخرى هي استخدام Enterprise


في هذه المقالة سنتعرف إلى كيفية استخدام الفئة ValidationAttribute

باختصار التطبيق الذي سنقوم به هو تعريف واصفة UnlikeAttribute مهمتها هي التحقق من عدم التطابق (الإختلاف) بين حقلين أو خاصيتين داخل فئة. اذا كنت قد استخدمت الواصفة CompareAttribute ستدرك أن ما سنقوم به الآن هو العكس تماما لمبدأ عمل Compare. حيث أن الفئة السابقة مهمتها التحقق من التطابق وبالتالي حدوث اختلاف بين قيمتين فهذا يعني أن النموذج غير صحيح وعليه يترتب إجراء مناسب لضمان سلامة وصحة البيانات. ولكن الواصفة UnlikeAttribute التي سنقوم بإنشائها ستكون مخالفة تماما. قد تتساءل ما الفائدة من ذلك؟ ببساطة في حال كنت قد قررت إضافة إمكانية تغير كلمة المرور للمستخدم داخل أحد تطبيقاتك فربما ستقرر بعدم السماح للمستخدم باستخدام نفس كلمة المرور الحالية ككلمة مرور جديدة!

تجهيز مشروع
1. قم بتجهيز أي مشروع تريد. في هذا المثال سيتم بناء تطبيق Console Application
2. ومن ثم قم بإضافة المكتبة System.ComponentModel.DataAnnotations
3. قم بإنشاء فئة جديدة وسمها UnlikeAttribute

الشيفرة التالية تظهر الفئة الجديدة مع التوابع التي سنحتاج إلى العمل عليها لإتمام المهمة

[AttributeUsage(AttributeTargets.Property, AllowMultiple = true)]public class UnlikeAttribute : ValidationAttribute
{
    private string otherPropertyName;
    private const string DefaultErrorMessage = "{0} must be different than {1}";
    public UnlikeAttribute(string otherProperty) : base(DefaultErrorMessage)
    {
        otherPropertyName = otherProperty;
    }
    public override string FormatErrorMessage(string name)
    {

    }

    protected override ValidationResult IsValid(object value,                ValidationContext validationContext)
    {

    }
}

لاحظ أن كلا التابعين FormatErrorMessage و IsValid عبارة عن توابع معرفة داخل الفئة ValidationAttribute والآن نقوم بإعادة تعريفها داخل الفئة الجديدة

وظيفة التابع FormatErrorMessage هو تهيئة رسالة الخطأ وذلك باستخدام الخاصية ErrorMessageString التابعة للفئة ValidationAttribute [1] ( سنقوم باستخدام هذه الخاصية لاحقا عند تعرف التابع)

والآن لنقوم بتجهيز التابع IsValid على النحو التالي:
protected override ValidationResult IsValid(object value         , ValidationContext validationConte
{
    PropertyInfo otherProperty = validationContext.ObjectInstance
        .GetType()
        .GetProperty(otherPropertyName);
    
    // in case no property where found 
    if (otherProperty == null) throw new 
                IndexOutOfRangeException($"{otherPropertyName} does not exist");
    
    // getting the value of the other property
    var otherPropertyValue = 
              otherProperty.GetValue(validationContext.ObjectInstance);
        
    // if they are different, then the case is successful
    if (!Equals(value, otherPropertyValue)) return ValidationResult.Success;
        
    return new ValidationResult(           FormatErrorMessage(validationContext.MemberName));
}

بإختصار كما تلاحظ فإنه قد تم استخدام ميزة الإنعكاس في الدوت نت للوصول إلى قيمة الخاصية otherPropertyName

ValidationContext هي عبارة عن فئة تستخدم لوصف البيئة التي قد تم فيها إجراء عملية الفحص. بمعنى آخر أن ValidationContext.ObjectInstance هو عبارة عن الكائن الذي يتم إجراء عليه عملية التحقق

والآن لنجهز التابع FormatErrorMessage

public override string FormatErrorMessage(string name)
{
    return string.Format(ErrorMessageString, name, otherPropertyName);
}


والآن قم بإنشاء نموذج يمثل تغير كلمة المرور PasswordChangeModel ، وقم بإضافة الواصفة إلى الخاصية NewPassword ومرر قيمة الخاصية OldPassword لتقوم الواصفة لاحقا بالتحقق من إختلاف كلا قيمتهما

public class PasswordChangeModel
{
    public string OldPassword { get; set; }

    [Unlike("OldPassword")]
    public string NewPassword { get; set; }
}


كيفة استخدام الواصفة
بعد إضافة الواصفة إلى الخاصية NewPassword لنجري عملية التحقق في أن كلمة المرور الجديدة لا تطابق القديمة كما يلي. لنذهب إلى التابع Main واكتب الأسطر التالية

static void Main(string[] args)
{
    var model = new PasswordChangeModel();
    model.OldPassword = "1234";
    model.NewPassword = "1234";
    var list = new List<ValidationResult>();
    if(!Validator.TryValidateObject(model, 
        new ValidationContext(model, null, null), list, true))
    {
        Console.WriteLine("Some errors found");
        foreach (var item in list) Console.WriteLine(item.ErrorMessage);
    }
}

تم استخدام الفئة Validator واستدعاء التابع TryValidateObject لتقوم بدورها وباستدعاء التابع IsValid للواصفات المرتبطة بجميع الخصائص.

والآن شغل البرنامج

ناتج تنقيذ البرنامج يظهر تطابق قيمتي OldPassword و NewPassword في حين يتوجب إختلافهما

كما تلاحظ رسالة الخطأ قد ظهرت وهي تظهر أن كلمة المرور متطابقة ويستلزم من المستخدم تغير كلمة المرور الجديدة بحيث تكون مختلفة عن القديمة ، وبهذا الشكل نكون قد تعرفنا إلى كيفية استخدام الفئة ValidationAttribute لتعريف واصفة خاصة بك.

أمور إضافية قد تود تطبيقها

لنظهر أسماء الخصائص الظاهرة في رسالة الخطأ
ربما تود إظهار أسماء الخصائص الظاهر بالرسالة بطريقة أفضل للمستخدم يمكننا استخدام الواصفة DisplayNameAttribute أو DisplayAttribute ، سنقوم باستخدام الواصفة DisplayAttribute إذ أن الأولى توفر إمكانية الربط مع ملف resx في حين الأخيرة لا توفر هذه الخاصية والآن لنجري التعديلات على الفئتين PasswordChangeModel و UnlikeAttribute على النحو التالي:

public class PasswordChangeModel
{
    [Display(Name = "Old Password")]
    public string OldPassword { get; set; }
    [Display(Name = "New Password")]
    [Unlike("OldPassword")]
    public string NewPassword { get; set; }
}

والآن

[AttributeUsage(AttributeTargets.Property, AllowMultiple = true)]
public class UnlikeAttribute : ValidationAttribute
{
    private string otherPropertyName;
    private string otherPropertyDisplay;
    private const string DefaultErrorMessage = "{0} must be different than {1}";
    public UnlikeAttribute(string otherProperty) : base(DefaultErrorMessage)
    {
        otherPropertyName = otherProperty;
    }
    public override string FormatErrorMessage(string name)
    {
        return string.Format(ErrorMessageString, name, otherPropertyDisplay);
    }
    protected override ValidationResult IsValid(object value, 
                               ValidationContext validationContext
    {
        PropertyInfo otherProperty = validationContext.ObjectInstance
            .GetType()
            .GetProperty(otherPropertyName);
        
        // in case no property where found 
        if (otherProperty == null)
            throw new IndexOutOfRangeException($"{otherPropertyName} does not exist");
        
        // getting the value of the other property
        var otherPropertyValue = 
                          otherProperty.GetValue(validationContext.ObjectInstance);
        // if they are different, then the case is successful
        if (!Equals(value, otherPropertyValue)) return ValidationResult.Success;
        // checks if DisplayAttribute has been used
        if (!IsDefined(otherProperty, typeof(DisplayAttribute)))
            return new ValidationResult(
                                                   FormatErrorMessage(validationContext.MemberName));

        // gets the DisplayAttribute.Name
        var displayAttribute =  (DisplayAttribute)  
                           otherProperty.GetCustomAttribute(typeof(DisplayAttribute));
        
        return new ValidationResult(FormatErrorMessage(validationContext.MemberName));
    }
}

تم تظليل التغيرات التي طرأت على الشيفرة



لاحظ كيف ظهرت الأسماء بناء على الواصفة NameAttribute

ماذا لو أردت استخدام ملف resources.resx
الأمر سهل جدا قم بإضافة نوع المصدر ResourceType

محتوى ملف AppResource.resx

والآن عد إلى الفئة PasswordChangeModel وأضف المصدر الذي تود للواصفة Display الربط معه
C#
public class PasswordChangeModel {
    [Display(Name = "OldPassword", ResourceType = typeof(AppResource))]
    public string OldPassword { get; set; }

    [Display(Name = "NewPassword", ResourceType = typeof(AppResource))]
    [Unlike("OldPassword")]
    public string NewPassword { get; set; }}

عدل UnlikeAttribute على النحو التالي:
C#
protected override ValidationResult IsValid(object value, 
                      ValidationContext validationConte
{
    PropertyInfo otherProperty = validationContext.ObjectInstance
        .GetType()
        .GetProperty(otherPropertyName);
    
    // in case no property where found 
    if (otherProperty == null)
        throw new IndexOutOfRangeException($"{otherPropertyName} does not exist");
    
    // getting the value of the other property
    var otherPropertyValue = otherProperty.GetValue(validationContext.ObjectInstance);
    // if they are different, then the case is successful
    if (!Equals(value, otherPropertyValue)) return ValidationResult.Success;
    // checks if DisplayAttribute has been used
    if (!IsDefined(otherProperty, typeof(DisplayAttribute)))
        return new ValidationResult(FormatErrorMessage(validationContext.MemberName));
    // gets the DisplayAttribute.Name
    var displayAttribute = 
        (DisplayAttribute)otherProperty.GetCustomAttribute(typeof(DisplayAttribute));

    // checks if Resource is bound 
    if (displayAttribute.ResourceType != null)
    {
        var manager = new ResourceManager(displayAttribute.ResourceType);
        otherPropertyDisplay = manager.GetString(otherPropertyName);
        return new ValidationResult(
            FormatErrorMessage(manager.GetString(validationContext.MemberName)));
    }
    
    return new ValidationResult(FormatErrorMessage(validationContext.MemberName));
}


لاحظ قد ظهرت الأسماء كما هي مخزنة في AppResources.resx

الشيفرة المصدرية: https://github.com/a-kanaan/SharedWorkspace/tree/master/UnlikeAttributeConsoleApp

المصادر:
1. https://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.validationattribute.formaterrormessage(v=vs.110).aspx
2. https://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.validationcontext(v=vs.110).aspx


حررت من قبل: عبد الكريم كنعان في السبت,16/جمادى الثانية/1439 هـ,09:11 صباحاً


--------------------
للأعلىأبلغ المشرف عن هذه المشاركة
لتعقيب على هذه المشاركة مباشرة
مشاركةالأربعاء,19/شوال/1441 هـ,03:47 صباحاً
المشاركة #2

الرتبة في المنتدى:رقيب

أيقونة المجموعة

المجموعة: الأعضاء
المشاركات: 10
سجل في:الثلاثاء,18/شوال/1441 هـ,06:03 صباحاً
الدولة:أثيوبيا
رقم العضوية: 115903



السلام عليكم
انا استمتع بذلك كثيرا
شكرا لك

omelettes


--------------------
للأعلىأبلغ المشرف عن هذه المشاركة
لتعقيب على هذه المشاركة مباشرة

    

عدد المتصفحين لهذا المنتدى «1»: (الضيوف «1» - المتخفون «0»)
الأعضاء «0»: .

إضافة رد جديد إضافة موضوع جديد



 
الوقت الأن:اليوم,11:40 مساءً بتوقيت القدس المحتلة

Powered By arabmoheet v3.1

منتديات المحيط العربي  -  راسلنا  -   أعلى
X   رسالة المنتدى
(سوف يتم اغلاق هذه النافذة بعد 2 ثانية)
X   رسالة المنتدى
(سوف يتم اغلاق هذه النافذة بعد 2 ثانية)