c# - online - vote ترجمة




تاريخ الميلاد التحقق من صحة يبقي تظهر (2)

أقوم بكتابة DOB - 22/12/1986 في مربع النص الخاص بي 22/12/1986 التحقق من الصحة. انها تقول:

The field DOB must be a date.

نموذجي :

[System.ComponentModel.DisplayName("DOB")]
[DisplayFormat(DataFormatString = "@{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)]
[Required(ErrorMessage = "Date Of Birth is required")]
[RegularExpression(@"{0:dd/MM/yyyy}", ErrorMessage = "Invalid Date")] // below is a link
public DateTime DOB { get; set; }

وجهة نظري:

<div class="form-group">
    @Html.LabelFor(model => model.DOB, htmlAttributes: new { @class = "control-label col-md-2" })
    <div class="col-md-10">
        @Html.EditorFor(model => model.DOB, new { htmlAttributes = new { @class = "form-control" } })
        @Html.ValidationMessageFor(model => model.DOB, "", new { @class = "text-danger" })
    </div>
</div>

في MS SQL database ، الحقل هو: DateTime

لماذا يقول التحقق من الصحة أن التاريخ الذي أدخلته غير صالح؟


استبدال . مع / في كلا المكانين كما ذكر غانيش - سمة DisplayFormat RegularExpression .


سبب التحقق من صحة العميل هو أن المكون الإضافي jquery.validate.js المستخدم من قبل jquery.validate.unobtrusive.js يتحقق من صحة التواريخ بناءً على تنسيق MM/dd/yyyy وتواريخ دخولك بناءً على تنسيق dd/MM/yyyy .

الرمز المحدد المستخدم في jquery.validate.js للتحقق هو

date: function(value, element) {
    return this.optional(element) || !/Invalid|NaN/.test(new Date(value));
}

والتي حسب المستعرض الذي تستخدمه ستعطي نتائج مختلفة (في Chrome ، new Date('22/12/1986') يُرجع 1987-10-11T13:30:00.000Z غير صالح ، لكن في FireFox يرجع 1987-10-11T13:30:00.000Z وهو صالح ، وليس فقط التاريخ الذي أدخلته)

تحتاج إلى تجاوز $.validator لتنسيق التواريخ في $.validator . خيار واحد هو استخدام البرنامج المساعد jquery.globalize .

بدلا من ذلك يمكنك كتابة السيناريو الخاص بك. لاحظ أن البرنامج النصي التالي مأخوذ من البرنامج المساعد الخاص بي المستخدم بالاقتران مع طريقة التمديد @Html.DatePickerFor() التي تنشئ منتقي تاريخ. تضيف طريقة الامتداد سمات html لتنسيق التاريخ بناءً على ثقافة الخادم ويتم قراءتها var format = regex.exec(this.inputFormat); سطر من التعليمات البرمجية التي قمت بالتعليق عليها واستبدالها بتنسيق الترميز الثابت الخاص بك. إذا كنت تريد فقط تنسيق dd/MM/yyyy ، فيمكن تبسيط البرنامج النصي لأنك تحتاج فقط إلى التنسيق "قليل النهاية"

<script type="text/javascript">
    // Override default date validator format to allow culture specific format
    $.validator.methods.date = function (value, element) {
        return this.optional(element) || globalDate(value).isValid();
    };

    globalDate = function (value) {
        // Initialise a new date
        var date = new Date(0);
        if (value == undefined) {
            // Return todays date
            return date;
        }
        // Get the components of the format
        // The separator can be forward slash, hyphen, dot and/or space
        var regex = new RegExp(/([dMy]+)([\s/.-]+)([dMy]+)([\s/.-]+)([dMy]+)/);
//------------- see notes above
        //var format = regex.exec(this.inputFormat);
        var format = regex.exec('dd/MM/yyyy');
//------------- 
        // Get the components of the value
        regex = new RegExp(/(\d+)([\s/.-]+)(\d+)([\s/.-]+)(\d+)/);
        value = regex.exec(value);
        // Check the value is valid
        if (value === null || value[2] !== format[2] || value[4] !== format[4]) {
            // Its not valid
            date.setTime(Number.NaN);
            return date;
        }
        // TODO: What if year entered as 2 digits?
        var day = Number.NaN;
        var month = Number.NaN;
        var year = Number.NAN;
        if (format[1].charAt(0) === 'd') {
            // little-endian (day, month, year)
            day = parseInt(value[1]);
            month = parseInt(value[3]) - 1;
            year = parseInt(value[5]);
        } else if (format[1].charAt(0) === 'M') {
            // middle-endian (month, day, year)
            day = parseInt(value[3]);
            month = parseInt(value[1]) - 1;
            year = parseInt(value[5]);
        } else {
            // big endian (year, month, day)
            day = parseInt(value[5]);
            month = parseInt(value[3]) - 1;
            year = parseInt(value[1]);
        }
        date.setFullYear(year);
        date.setMonth(month);
        date.setDate(day);
        // Check its valid
        if (date.getDate() !== day || date.getMonth() !== month || date.getFullYear() !== year) {
            date.setTime(Number.NaN);
            return date;
        }
        return date;
    }

    // Methods 
    Date.prototype.isValid = function () {
        return !isNaN(this.getTime());
    }
</script>

ملاحظة جانبية: لا تقوم السمة [RegularExpression] بأي شيء ويمكن إزالتها.





model-view-controller