asp.net mvc - एस्पनेट एमवीसी मॉडल में कस्टम सत्यापन लागू नहीं किया जा सकता है



asp.net-mvc validation (1)

इसलिए मेरे पास यह मुद्दा है। मेरे पास 2 फ़ील्ड Date of birth और Start working date मैं इस के बाद कस्टम सत्यापन लागू करना चाहता हूं यदि

काम करने की तारीख शुरू करें - जन्म तिथि है> = 22

तो मान्य है.तो यहाँ मेरा कोड है

[AttributeUsage(AttributeTargets.Property)]
    public class MiniumAgeAttribute:ValidationAttribute
    {
        private DateTime dob { get; set; }
        private DateTime startDate { get; set; }
        public MiniumAgeAttribute(DateTime DOB, DateTime StartDate)
        {
            dob = DOB;
            startDate = StartDate;
        }

        protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {
            int age;
            age = startDate.Year - dob.Year;
            if (age >= 22)
            {
                return ValidationResult.Success;
            }
            else
            {
                return new ValidationResult("Age is required to be 22 or more");
            }

        }
}

लेकिन जब मैं मॉडल में मेरे सत्यापन नियमों को लागू करता हूं तो मुझे यह त्रुटि मिलती है।

तो मैं इसे कैसे ठीक कर सकता हूं तरह का संबंध।


गुण मेटाडेटा हैं और समय संकलन में जाना चाहिए और इसलिए स्थिर होना चाहिए। आप उस प्रॉपर्टी का मूल्य नहीं दे सकते हैं जो रनटाइम तक नहीं पता है। इसके बजाय, आप संपत्ति के नाम को पास करते हैं और संपत्ति का मूल्य प्राप्त करने के लिए प्रतिबिंब का उपयोग करते हैं।

आमतौर पर आप विशेषता के साथ एक मॉडल की संपत्ति को सजाने के लिए केवल दूसरी संपत्ति का नाम देना आवश्यक है, न कि दोनों dob और startDate । आपके अतिरिक्त विशेषता में कोई लचीलेपन की अनुमति नहीं है क्योंकि आपके पास विधि में कठोर कोड की गई है, और उस मान को विधि में भी पारित किया जाना चाहिए ताकि इसे प्रयोग में लाया जा सके (कहते हैं)

[MiminumAge(22, "DateOfBirth")] // or [MiminumAge(18, "DateOfBirth")]
public DateTime StartDate { get; set; }
public DateTime DateOfBirth { get; set; }

आप तर्क भी गलत है क्योंकि startDate.Year - dob.Year के दिन और महीने के मूल्यों को ध्यान में नहीं लेता है।

आपकी विशेषता होना चाहिए

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
public class MiminumAgeAttribute : ValidationAttribute
{
    private const string _DefaultErrorMessage = "You must be at least {0} years of age.";
    private readonly string _DOBPropertyName;
    private readonly int _MinimumAge;

    public MiminumAgeAttribute (string dobPropertyName, int minimumAge)
    {
        if (string.IsNullOrEmpty(dobPropertyName))
        {
            throw new ArgumentNullException("propertyName");
        }
        _DOBPropertyName= dobPropertyName;
        _MinimumAge = minimumAge;
        ErrorMessage = _DefaultErrorMessage;
    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        DatetTime startDate;
        DateTime dateOfBirth;
        bool isDateValid = DateTime.TryParse((string)value, out startDate);
        var dobPropertyName = validationContext.ObjectInstance.GetType().GetProperty(_DOBPropertyName);
        var dobPropertyValue = dobPropertyName.GetValue(validationContext.ObjectInstance, null);
        isDOBValid = DateTime.TryParse((string)dobPropertyValue, out dateOfBirth);
        if (isDateValid && isDOBValid)
        {
            int age = startDate.Year - dateOfBirth.Year;
            if (dateOfBirth > startDate.AddYears(-age))
            {
                age--;
            }
            if (age < _MinimumAge)
            {
                return new ValidationResult(string.Format(ErrorMessageString, _MinimumAge));
            }
        }
        return ValidationResult.Success;
    }
}

आप IClientValidatable को लागू करने और jquery.validate.js और jquery.validate.unobtrusive.js प्लगइन्स का उपयोग करके क्लाइंट साइड मान्यता देने के लिए स्क्रिप्ट को जोड़कर IClientValidatable और भी बढ़ा सकते हैं। अधिक विस्तार के लिए, एएसपी.नेट एमवीसी 3 - भाग -2 में प्रमाणन के लिए पूर्ण गाइड देखें





model