jquery - एमवीसी कस्टम सत्यापन:दो तिथियों की तुलना करें




asp.net-mvc asp.net-mvc-3 validation (5)

आखिरी उत्तर में कॉलर को कॉल पर कुछ लापता ब्रांडेस थे, यहां दस्तावेज़ तैयार और $। Validator.unobtrusive ...- part:

$(function () {
    $.validator.addMethod("isdateafter", function(value, element, params) {
        var parts = element.name.split(".");
        var prefix = "";
        for (var i = 0; i < parts.length - 1; i++) {
            prefix = parts[i] + ".";
        }

        var startdatevalue = $('input[name="' + prefix + params.propertytested + '"]').val();

        if (!value || !startdatevalue) return true;    

        var allowequal = params.allowequaldates.toLowerCase() === "true";
        return allowequal ? Date.parse(startdatevalue) <= Date.parse(value) :
            Date.parse(startdatevalue) < Date.parse(value);
    });
    $.validator.unobtrusive.adapters.add('isdateafter', 
        ['propertytested', 'allowequaldates'], 
        function (options) {
            options.rules['isdateafter'] = options.params;
            options.messages['isdateafter'] = options.message;
        });
});

मैंने कस्टम वैलिडेशन एट्रिब्यूट बनाया है जो 2 तिथियों की तुलना करता है और यह सुनिश्चित करता है कि दूसरी तारीख पहले से अधिक हो:

public sealed class IsDateAfter : ValidationAttribute, IClientValidatable
{
    private readonly string testedPropertyName;
    private readonly bool allowEqualDates;

    public IsDateAfter(string testedPropertyName, bool allowEqualDates = false)
    {
        this.testedPropertyName = testedPropertyName;
        this.allowEqualDates = allowEqualDates;
    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        var propertyTestedInfo = validationContext.ObjectType.GetProperty(this.testedPropertyName);
        if (propertyTestedInfo == null)
        {
            return new ValidationResult(string.Format("unknown property {0}", this.testedPropertyName));
        }

        var propertyTestedValue = propertyTestedInfo.GetValue(validationContext.ObjectInstance, null);

        if (value == null || !(value is DateTime))
        {
            return ValidationResult.Success;
        }

        if (propertyTestedValue == null || !(propertyTestedValue is DateTime))
        {
            return ValidationResult.Success;
        }

        // Compare values
        if ((DateTime)value >= (DateTime)propertyTestedValue)
        {
            if (this.allowEqualDates)
            {
                return ValidationResult.Success;
            }
            if ((DateTime)value > (DateTime)propertyTestedValue)
            {
                return ValidationResult.Success;
            }
        }

        return new ValidationResult(FormatErrorMessage(validationContext.DisplayName));
    }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        var rule = new ModelClientValidationRule
        {
            ErrorMessage = this.ErrorMessageString,
            ValidationType = "isdateafter"
        };
        rule.ValidationParameters["propertytested"] = this.testedPropertyName;
        rule.ValidationParameters["allowequaldates"] = this.allowEqualDates;
        yield return rule;
    }

कैलेंडर एंटर्री कक्षा: ...

public virtual DateTime StartDate { get; set; }

[IsDateAfter("StartDate", true, ErrorMessage="End date needs to be after start date")]
public virtual DateTime EndDate { get; set; }

राय:

$.validator.unobtrusive.adapters.add(
    'isdateafter', ['propertytested', 'allowequaldates'], function (options) {
    options.rules['isdateafter'] = options.params;
    options.messages['isdateafter'] = options.message;
});
$.validator.addMethod("isdateafter", function(value, element, params) {
    alert(params.propertytested);
    var startdatevalue = $('input[name="' + params.propertytested + '"]').val();
    if (!value || !startdatevalue) return true;
    return (params.allowequaldates) ? Date.parse(startdatevalue) <= Date.parse(value) : Date.parse(startdatevalue) < Date.parse(value);
}, '');

यह ठीक काम करता है जब कैलेंडर एंट्री किसी अन्य वर्ग के अंदर लपेटा नहीं जाता है। हालांकि, जब मैं एक दृश्य मॉडल का उपयोग करता हूं:

    public class TrainingDateEditViewModel
    {
        #region Properties

        /// <summary>
        /// Gets or sets CalendarEntry.
        /// </summary>
        public CalendarEntry CalendarEntry { get; set; }
....

क्लाइंट सत्यापन अब काम नहीं करता है क्योंकि उत्पादित एचटीएमएल आउटपुट यह है:

<input type="text" value="" name="CalendarEntry.EndDate" id="CalendarEntry_EndDate" data-val-isdateafter-propertytested="StartDate" data-val-isdateafter-allowequaldates="True" data-val-isdateafter="End date needs to be after start date" data-val="true">

और यह

data-val-isdateafter-propertytested="StartDate" and IT SHOULD BE: "CalendarEntry.StartDate".

मैं इसे कैसे बनाऊंगा ताकि यह "कैलेंडरइन्ट्री.स्टार्टडेट" नियम से जुड़ जाए। वैधता पैरामीटर ["propertytested"] = this.testedPropertyName; // यहां यह पूरा नाम होना चाहिए ??? किस तरह??

धन्यवाद


परीक्षण किए गए तत्व के उपसर्ग की जांच करने के लिए आपको अपने क्लाइंट-साइड स्क्रिप्ट को संशोधित करने की आवश्यकता है, और अपने चयनकर्ता को उपसर्ग (यदि कोई है) जोड़ें, निम्नानुसार है:

$.validator.addMethod("isdateafter", function(value, element, params) {
    var parts = element.name.split(".");
    var prefix = "";
    if (parts.length > 1)
        prefix = parts[0] + ".";
    var startdatevalue = $('input[name="' + prefix + params.propertytested + '"]').val();
    if (!value || !startdatevalue) 
        return true;    
    return (params.allowequaldates) ? Date.parse(startdatevalue) <= Date.parse(value) :
        Date.parse(startdatevalue) < Date.parse(value);
});

इस कोड के अंदर ग्राहक पक्ष को शामिल करना न भूलें। मुझे यह पता लगाने में घंटों लग गए कि यह गायब था!

(function ($) {

  // your code here..

})(jQuery);

बस काउंसेलोरबेन की जावास्क्रिप्ट में एक छोटी सी त्रुटि को ठीक करने के लिए: "(params.allowequaldates)" को स्ट्रिंग के रूप में व्याख्या किया जाएगा (जिसमें "गलत" या "True" का मान होगा), लेकिन उस स्ट्रिंग का हमेशा सत्य मूल्यांकन किया जाएगा, इस प्रकार हमेशा बराबर तारीखों की अनुमति देता है। यदि आप केवल 1 की तुलना में अपनी वस्तुओं के घोंसले के अधिक स्तरों की अनुमति देना चाहते हैं, तो आप पाएंगे:

$.validator.addMethod("isdateafter", function(value, element, params) {
    var parts = element.name.split(".");
    var prefix = "";
    for (var i = 0; i < parts.length - 1; i++)
       prefix = parts[i] + ".";
    var startdatevalue = $('input[name="' + prefix + params.propertytested + '"]').val();
    if (!value || !startdatevalue) 
        return true;    
    var allowequal = params.allowequaldates.toLowerCase === "true";
    return allowequal ? Date.parse(startdatevalue) <= Date.parse(value) :
        Date.parse(startdatevalue) < Date.parse(value);
});

तारीख आईएसओ मानक की जांच करें; इस तरह की तरह:

yyyy.MM.ddThh:mm

यह 2008.11.20T22:18 बन जाता है।







jquery asp.net-mvc asp.net-mvc-3 validation