web-gelistirme-sc.com

Kendo DatePicker, özel tarih formatı için doğrulamada başarısız oldu

ASP.NET MVC 4 projemdeki bir Kendo Izgarasında görüntülenen bir Tarih alanını düzenlemek için Kendo DatePicker kullanıyorum. DatePicker öğesinin Date alanı için kullanılmasını sağlamak için, özel tarih formatı dizesini kullanın, EditorTemplates klasörü altındaki Date.cshtml dosyasını aşağıdaki şekilde güncelledim:

@(Html.Kendo().DatePickerFor(m => m).Format("dd/MM/yyyy"))

Bunu yaparak, DatePicker’in istediğim gibi formatı görüntülemesini sağladım. Ancak, giriş için girilen tarihlerin bazıları için, manuel anahtarla veya açılan takvimin seçimiyle doğrulama başarısız oldu.

Daha fazla araştırma üzerine, DatePicker’ın M/d/Y biçimini temel alarak tarihi doğruladığını söyleyebilirim. Bu varsayım, 12/1/2012 tarihinin geçerli bir tarih olduğu ve 13/1/2012 tarihinin olmadığı tarihine dayanarak yapıldı.

Ayrıca Date.cshtml içindeki DatePicker bildiriminin sonuna .ParseFormat("dd/MM/yyyy") eklemeyi denedim, ancak hiçbir şeyi çözmedi. Bu yüzden bunun kesinlikle bir hata olduğunu ve bunu daha sonra Telerik'e rapor edeceğimi söyleyebilirim.

Ama şu an için, bu çalışmayı sürdürmek için bir geçici çözüm arıyorum. Kendi doğrulama fonksiyonuma sahip olmak için Javascript'teki kendo.ui.validator.rules.mvcdate işlevini geçersiz kılabileceğimi biliyorum. Chrome'da bu iyi çalışıyor olsa da, IE9'da çalışmıyor.

Peki, DatePicker’ın dd/MM/yyyy giriş biçimini kabul etmesini nasıl sağlayabilirim? Şimdiden teşekkürler.

21
Amry

Dahili olarak, ASP.NET MVC’nin tarih doğrulaması kuralı (göze çarpmayan istemci doğrulaması), dahili olarak önceden tanımlanmış tarih desenleri biçimini kullanacak şekilde önceden tanımlanmış tarih desenleri } yöntemini kullanır./s tanımlanmıştır/tanımlanmıştır. Sizin durumunuzda varsayılan kültürün "en-US" olduğunu ve doğrulama işleminin başarısız olmasının nedeni budur, çünkü "dd/MM/yyyy" formatındaki tarihler geçerli sayılmaz. Olası bir çözüm, tarih doğrulama kuralını (sizin yaptığınız gibi) geçersiz kılmak ve belirli bir format kullanarak dizeyi ayrıştırmaktır. Diğer seçenek, sayfa için farklı kültür ayarlarının yapılmasıdır. Örneğin, "de-DE" kültürünün kısa tarih biçimi "dd/MM/yyyy" dir.

12
George K

Bu yöntemi kullanıyorum ve iyi çalışıyor ..

Bu iki satırı sayfanıza ekleyin ..

<script src="@Url.Content("~/Scripts/jquery.validate.js")"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")"></script>

Sonra jQuery tarih doğrulama yöntemini geçersiz kılın ..

<script>
    $(document).ready(function () {
        kendo.culture("en-MY"); //your culture
        $.validator.addMethod('date',
           function (value, element) {
               return this.optional(element) || kendo.parseDate(value)
           });
    });
</script>

Bu arada benim Web.config içinde bu var ...

<system.web>
    <globalization uiCulture="en-MY" culture="en-MY"></globalization>
</system.web>
10
Rosdi Kasim
  [DataType(DataType.Date)]
  [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)]
  [Required(ErrorMessage = "Pick a date from Kendo Date Picker")]
   public DateTime mydate{ get; set; }

    @(Html.Kendo().DatePickerFor(m=>m.mydate)
                .Name("MyDate")
                .Format("dd/MM/yyyy")
                 .ParseFormats(new string[] {"dd/MM/yyyy"}))

/ Script document.ready fonksiyonu ekle /

     $(document).ready(function () { kendo.culture("en-GB");

         $.validator.methods['date'] = function (value, element) {
    var check = false;
    var re = /^\d{1,2}\/\d{1,2}\/\d{4}$/;
    if (re.test(value)) {

        var adata = value.split('/');
        var dd = parseInt(adata[0], 10);

        var mm = parseInt(adata[1], 10);
        var yyyy = parseInt(adata[2], 10);
        var xdata = new Date(yyyy, (mm - 1), dd);

        if ((xdata.getFullYear() == yyyy) && (xdata.getMonth() == (mm - 1)) && 
            (xdata.getDate() == dd)) {

            check = true;
        }
        else {
            alert(value);
            check = false;
        }

    } else
        check = false;
    return this.optional(element) || check;
}

});

4
user3119287

Gantt bileşenini kullanırken de aynı sorunu yaşadım here . Telerik desteği beni here 'a işaret ederek doğru çizgilere koydu.

Önemli ihmalim, _Layout.vbhtml dosyama aşağıdakileri dahil etmememdi:

<script>
kendo.culture("en-GB");
</script>

Bir kez dahil edildikten sonra (JS paketimdeki uygun kendo.culture senaryo ile birlikte) yardımcı beklendiği gibi davranmaya başladı.

1
Richard Freeman

Tarih doğrulama kuralını değiştirdim: 

$.validator.methods.date = function (value, element) {
    return this.optional(element) || /^\d\d?-\w\w\w-\d\d\d\d/.test(value);
};

Benim biçimim sizinkinden biraz farklı, ancak bunu değiştirebilmelisiniz.

1
J.P. Hamilton

Basit cevap, özel bir tarih formatı kullanmamaktır. Sadece her zaman açıkça .Format ("MM/gg/yyyy") yapın ve "dd/AA/yyyy" kullanmayın ("yyyy-AA-gg" veya "MMM g, yyyy" iyi olabilir). Web sunucunuzu ABD’deki bölgesel ayarları kontrol panelinde veya Web.config’te kullanacak şekilde ayarlayın.

Şimdi problemin bir açıklaması ve gerçekte dd/MM/yyyy'nin nasıl çalışacağını açıklamak için:

Kendo tarih doğrulaması, varsayılan kendo kültür tarih biçimini kendo.culture (). Calendar.patterns.d (ve .t için) kullanır. Bunu doğrudan ayarlarsanız veya farklı bir kültür uygularsanız, doğrulanacak tarih biçimini ayarlar. Kendo.parseDate'i kullanır, böylece "MMM d, yyyy" gibi bir şey iyi olur, ancak "dd/MM/yyyy" gibi bir şey d> 12 ve varsayılan ABD kültürü kullanılıyorsa doğrulama işleminde başarısız olur (bkz. kültürleri değiştir).

Bunun olmasının nedeni, DatePicker.Format (...) öğesinin biraz bozuk olmasıdır. DatePicker biçimini yok sayan ve geçerli kültür tarihi biçimini kullanarak parseDate'i çalıştıran alternatif bir tarih doğrulama işlevi sağlayan kendo.aspnetmvc.js dosyasında bir hatadır. Bu sabit javascript:

    date: function(input) {
        var dp = input.data("kendoDatePicker") || input.data("kendoDateTimePicker");
        if (dp != undefined) {
            return input.val() === "" || kendo.parseDate(input.val(), dp.options.format) !== null;
        }

        return input.val() === "" || kendo.parseDate(input.val()) !== null;
    },

Ayrıca, tarih doğrulama işlevinde kendo.validator.js/kendo.web.js'deki küçük bir hata vardır ve Internet Explorer'daki ızgaralarda tarih doğrulamasını her zaman başarısız kılar.

Ayrıca, web sunucusu globalizasyonunuzun kendo kültürüyle eşleşecek şekilde ABD olarak ayarlandığından emin olun (Web.config'de veya Windows Bölgesel Denetim Masası'nda). Firefox'ta MM/gg/yyyy gönderiliyor ve web sunucusunun buna uyması gerekiyor. Ayrıca, DatePicker.Format'ı açıkça belirtmezseniz, web sunucusu bölgesel tarih biçimi tüm istemci tarayıcılara uygulanır. Bu nedenle, web sunucunuz Windows için kontrol panelinde ayarlanmış Kanada/İngiliz tarih biçimleri varsa, kendo grid DatePickers varsayılanı gg/AA/yyyy olarak ayarlar, sonra doğrulamada hata yapar ve firefox web sunucusuna gönderdiğinde (firefox postları altında kendo varsayılan kültür MM/dd/yyyy, eğer web sunucunuz dd/MM/yyyy'yi bekliyorsa, mvc tarih bağlaması başarısız olur).

Not: mvc olmayan tarih doğrulayıcıyı kullanmayı tercih ediyorsanız: data-val-date özelliğini kaldırın. Ekle: veri türü =\"tarih \" veri biçimi =\"gg/AA/yyyy s: dd: ss tt \". Html yardımcı kullanarak bu mümkün olmadığını düşünüyorum. Doğrudan html ve javascript belirtmelisiniz.

Not: Izgara olmayan DatePickers, "data-val-date" özniteliği bulunmadığından hiçbir doğrulaması yok gibi görünüyor.

Ayrıca: "KendoUI'nin tarih ayrıştırmak için önce parseFormats seçeneğini kullandığını, ardından format seçeneğine dönüştürdüğünü ve son olarak doğrulamaları çalıştırdığını unutmayın. Bu yüzden [" MM/dd/yyyy "," değil gg/aA/yyyy "]." - Bir tarihi doğrulamak nasıl kendo validator kullanarak yyyy-MM-gg biçiminde?

Web.config için Küreselleşme Hattı:

<globalization requestEncoding="utf-8" responseEncoding="utf-8" culture="en-US" uiCulture="en-US" />
0
Curtis Yallop