سؤال

أنا بخير بالفعل مع استخدام طريقة التحقق الأخرى. يبدو أنه لا يوجد العديد من الخيارات المسبقة للقيام بالتحقق من صحة مع ASP.NET MVC 1.0. الشيء الرئيسي الذي أراه الناس يتحدثون عنه هو XVAL. ومع ذلك ، لا يوجد حرفيا وثائق لذلك. في الواقع ، يبدو أن مدونة المؤسس لها وظيفتين فقط عليها.

على أي حال ، إنه الشيء الوحيد الذي رأيته يمكنه أيضًا توفير التحقق من صحة العميل. مشكلتي هي أنه لا يمكنني استخدام الأشياء القائمة على السمات لأنني أقوم بإنشاء طرزتي باستخدام LLBLGEN ولا أريد تعديل الكود.

كل ما قرأته عن XVAL يتحدث عن إمكانية تنفيذ iRulesprovider ولكن لا توجد معلومات حقيقية عن كيفية القيام بذلك واستخدامه. لقد وجدت بعض التعليمات البرمجية التي تنفذها ولكن باستخدام سمات لا يمكنني فعلها حقًا.

لذا ، هل يمكن لأي شخص تقديم بعض التوجيهات حول كيفية استخدام XVAL إذا لم أكن أقوم بترميز فئات النماذج الخاصة بي أو ذاهب إلى استخدام DataAntations أو شيء مشابه (أنا منفتح على بديل لـ XVAL لكنني لم أر شيئًا وأحتاج إلى ذلك التمسك بـ ASP.NET MVC 1.0 وأحتاج إلى دعم التحقق من صحة جانب العميل)؟

يحرر: لا أعتقد أن نهج الطبقة الجزئية ستعمل بالنسبة لي لأنني سأقوم بإنشاء الكود كثيرًا وسوف يكون في مجموعات مختلفة.

هل كانت مفيدة؟

المحلول

يمكنك استخدام XVAL مع LLBLGEN أو أي فئات أخرى تم إنشاؤها بواسطة ORM باستخدام سمة MetaDatatype على فئة جزئية. على سبيل المثال ، إذا كان لديك كيان تم إنشاؤه LLBL يسمى Userentity ، فسوف تقوم بإنشاء فئة جزئية وتمييزها مع سمة metadatatype مثل هذا:

[MetadataType(typeof(UserEntityMetaData))]
public partial class UserEntity
{
}

سوف تقوم من إنشاء فئة التعريف حيث يمكنك تمييز الخصائص مع السمات المناسبة مثل هذه:

public class UserEntityMetaData
{
    [Required()]
    [StringLength(50)]
    [DataType(DataType.EmailAddress)]
    public object EmailAddress { get; set; }
    [Required()]
    [StringLength(32)]
    [DataType(DataType.Password)]
    public object Password { get; set; }
    [Required()]
    [StringLength(25)]
    public object FirstName { get; set; }
    [Required()]
    [StringLength(25)]
    public object LastName { get; set; }
}

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

نصائح أخرى

بالإضافة إلى ما قاله jcerhea إنك بحاجة أيضًا إلى تعديل كيفية إعداد فئة DataAntationSvalidationRunner للتعامل مع فئات "Buddy" في طريقة GeterRors ، على سبيل المثال

    namespace Entities
    {
        public static class DataAnnotationsValidationRunner
        {
            public static IEnumerable<ErrorInfo> GetErrors(object instance)
            {
                var metadataAttrib = instance.GetType().GetCustomAttributes(typeof(MetadataTypeAttribute), true).OfType<MetadataTypeAttribute>().FirstOrDefault();
                var buddyClassOrModelClass = metadataAttrib != null ? metadataAttrib.MetadataClassType : instance.GetType();
                var buddyClassProperties = TypeDescriptor.GetProperties(buddyClassOrModelClass).Cast<PropertyDescriptor>();
                var modelClassProperties = TypeDescriptor.GetProperties(instance.GetType()).Cast<PropertyDescriptor>();

                return from buddyProp in buddyClassProperties
                       join modelProp in modelClassProperties on buddyProp.Name equals modelProp.Name
                       from attribute in buddyProp.Attributes.OfType<ValidationAttribute>()
                       where !attribute.IsValid(modelProp.GetValue(instance))
                       select new ErrorInfo(buddyProp.Name, attribute.FormatErrorMessage(string.Empty), instance);
            }
        }
    }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top