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




validation model (2)

इसलिए मेरे पास यह मुद्दा है। मेरे पास 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");
            }

        }
}

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

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


Answers

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

आमतौर पर आप विशेषता के साथ एक मॉडल की संपत्ति को सजाने के लिए केवल दूसरी संपत्ति का नाम देना आवश्यक है, न कि दोनों 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 में प्रमाणन के लिए पूर्ण गाइड देखें


यहां एक बेहतर encapsulated समाधान है:

http://www.spicelogic.com/Journal/ASP-NET-MVC-DropDownListFor-Html-Helper-Enum-5

कहो आपका मॉडल है:

नमूना उपयोग:

जेनरेटेड यूआई:

और उत्पन्न एचटीएमएल

सहायक विस्तार स्रोत कोड स्नैप शॉट:

आप दिए गए लिंक से नमूना प्रोजेक्ट डाउनलोड कर सकते हैं।

संपादित करें: यहां कोड है:

public static class EnumEditorHtmlHelper
{
    /// <summary>
    /// Creates the DropDown List (HTML Select Element) from LINQ 
    /// Expression where the expression returns an Enum type.
    /// </summary>
    /// <typeparam name="TModel">The type of the model.</typeparam>
    /// <typeparam name="TProperty">The type of the property.</typeparam>
    /// <param name="htmlHelper">The HTML helper.</param>
    /// <param name="expression">The expression.</param>
    /// <returns></returns>
    public static MvcHtmlString DropDownListFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper,
        Expression<Func<TModel, TProperty>> expression) 
        where TModel : class
    {
        TProperty value = htmlHelper.ViewData.Model == null 
            ? default(TProperty) 
            : expression.Compile()(htmlHelper.ViewData.Model);
        string selected = value == null ? String.Empty : value.ToString();
        return htmlHelper.DropDownListFor(expression, createSelectList(expression.ReturnType, selected));
    }

    /// <summary>
    /// Creates the select list.
    /// </summary>
    /// <param name="enumType">Type of the enum.</param>
    /// <param name="selectedItem">The selected item.</param>
    /// <returns></returns>
    private static IEnumerable<SelectListItem> createSelectList(Type enumType, string selectedItem)
    {
        return (from object item in Enum.GetValues(enumType)
                let fi = enumType.GetField(item.ToString())
                let attribute = fi.GetCustomAttributes(typeof (DescriptionAttribute), true).FirstOrDefault()
                let title = attribute == null ? item.ToString() : ((DescriptionAttribute) attribute).Description
                select new SelectListItem
                  {
                      Value = item.ToString(), 
                      Text = title, 
                      Selected = selectedItem == item.ToString()
                  }).ToList();
    }
}




asp.net-mvc validation model