Pytanie Kendo DatePicker nie sprawdza poprawności niestandardowego formatu daty


Używam Kendo DatePicker do edycji pola daty wyświetlanego w Kendo Grid w moim projekcie ASP.NET MVC 4. Aby użyć DatePicker dla pola Date, użyj niestandardowego ciągu formatu daty, zaktualizowałem Date.cshtml plik pod EditorTemplates folder do następujących:

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

W ten sposób udało mi się wyświetlić format DatePicker w żądanym formacie. Jednak nie udało się zatwierdzić niektórych dat wprowadzonych do wprowadzania, albo za pomocą klawisza ręcznego lub wyboru z podręcznego kalendarza.

Po dalszych badaniach mogę powiedzieć, że DatePicker sprawdza poprawność daty na podstawie M/d/Y format. Założenie to zostało oparte na moich założeniach, że data 12/1/2012 jest prawidłowa, a 13/1/2012 nie.

Próbowałem też dodać .ParseFormat("dd/MM/yyyy") na końcu deklaracji DatePicker w Date.cshtml ale niczego nie naprawia. Powiedziałbym więc, że jest to z pewnością błąd i poinformuję o tym Telerika później.

Ale na razie szukam obejścia, żeby to zadziałało. Uważam, że mogę to zmienić kendo.ui.validator.rules.mvcdate w JavaScript, aby mieć moją własną funkcję sprawdzania poprawności. Mimo że działa to dobrze w Chrome, nie działa w IE9.

Tak więc, wszelkie pomysły, jak mogę uczynić DatePicker do zaakceptowania dd/MM/yyyy format wejściowy? Z góry dziękuję.


21
2017-07-24 06:22


pochodzenie


Czy zdarzyło ci się to zgłosić lub opublikować na forach kendo? - Patrick M


Odpowiedzi:


Wewnętrznie stosowana jest reguła sprawdzania poprawności daty dla ASP.NET MVC (dyskretna walidacja klienta) kendo.parseDate (ciąg) metoda wewnętrznie używana predefiniowane wzorce daty jeśli żaden format / s nie jest / są zdefiniowane. Przypuszczam, że w twoim przypadku kultura domyślna to "en-US" i dlatego sprawdzanie poprawności nie powiedzie się, ponieważ daty o formacie "dd / MM / rrrr" są uważane za nieprawidłowe. Jednym z możliwych rozwiązań jest przesłonięcie reguły sprawdzania poprawności daty (tak jak to zrobiłaś) i przeanalizowanie ciągu znaków przy użyciu określonego formatu. Inną opcją jest ustawienie ustawień kultury diff dla strony. Na przykład krótki format daty dla kultury "DE-DE" to "dd / MM / rrrr".


12
2017-07-25 08:33



To działało dla mnie. Ale chciałbym, żeby było lepiej, gdyby implementacja Kendo MVC nie robiła nieudokumentowanych magicznych rzeczy na szczycie standardowej biblioteki Kendo Javascript. - Amry
Validator Kendo UI nie wspiera dyskretnej walidacji ASP.NET MVC po wyjęciu z pudełka. Dlatego musisz dołączyć plik kendo.aspnetmvc.js, który zapewnia dodatkowe reguły sprawdzania poprawności. Nie sądzę, że to magiczne rzeczy. Zdecydowanie poprawimy dokumentację dotyczącą walidacji Kendo MVC. - George K


Używam tej metody i działa dobrze ...

Dodaj te dwa wiersze na swojej stronie ..

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

Następnie przesłonię metodę sprawdzania poprawności daty jQuery.

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

Tymczasem w moim Web.config Mam to...

<system.web>
    <globalization uiCulture="en-MY" culture="en-MY"></globalization>
</system.web>

9
2018-04-09 09:33



Nie używam globalizacji na web.config. Ale skrypt rozwiązania działa wspaniale przy niewielkich modyfikacjach: kendo.parseDate(value, "dd/MM/yyyy"). dodaj żądany format do kendo.parseDate i to działa. - Issac
Dziękuję, to działa dla mnie. - Thomas.Benz


  [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"}))

/Dodaj funkcję script document.ready/

     $(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
2017-12-19 13:25





Zmieniłem regułę sprawdzania poprawności daty:

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

Mój format jest nieco inny niż twój, ale powinieneś być w stanie to zmienić.


1
2017-07-24 16:17



Twoje rozwiązanie nie działa dla mnie. $.validator jest niezdefiniowana, a kod w niej nie jest wyzwalany. Nie sądzę, że Kendo używa walidatora JQuery. - Amry
Interfejs użytkownika Kendo ma własny walidator. To nie jest walidacja jQuery. Sprawdź ten link - demos.kendoui.com/web/validator/index.html - George K


Miałem ten sam problem podczas korzystania z komponentu Gantta tutaj. Wsparcie Telerik postawiło mnie na właściwych liniach, odnosząc mnie do tutaj.

Moje zasadnicze zaniedbanie polegało na tym, że nie zawarłem tego w moim pliku _Layout.vbhtml:

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

Po dołączeniu (wraz z odpowiednim skryptem kendo.culture w moim pakiecie JS) helper zaczął działać zgodnie z oczekiwaniami.


1
2018-01-08 07:29





Prosta odpowiedź brzmi: nie używaj niestandardowego formatu daty. Po prostu zawsze wykonaj .Format ("MM / dd / rrrr") i nie używaj "dd / MM / rrrr" ("rrrr-MM-dd" lub "MMM d, rrrr" może być ok). I skonfiguruj swój serwer sieciowy tak, aby korzystał z regionalnych ustawień USA w panelu sterowania lub w Web.config.

Teraz wyjaśnienie problemu i jak sprawić, aby dd / MM / rrrr działał:

Sprawdzanie daty Kendo używa domyślnego formatu daty kultury kendo kendo.culture (). Calendar.patterns.d (i .t na czas). Jeśli ustawisz to bezpośrednio lub zastosujesz inną kulturę, która ustawi walidowany format daty. Używa kendo.parseDate, więc coś w rodzaju "MMM d, rrrr" będzie w porządku, ale coś takiego jak "dd / MM / rrrr" nie przejdzie sprawdzania poprawności, jeśli d> 12 i domyślna kultura amerykańska jest używana (patrz kendo Demo globalizacji, aby dowiedzieć się, jak przełączać kultury).

Dzieje się tak dlatego, że DatePicker.Format (...) jest lekko zepsuty. Jest to błąd w kendo.aspnetmvc.js, który zapewnia alternatywną funkcję sprawdzania daty, która ignoruje format DatePicker i po prostu uruchamia parseDate przy użyciu aktualnego formatu daty kultury. To jest naprawiony 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;
    },

Występuje również drobny błąd w funkcji sprawdzania poprawności danych w kendo.validator.js / kendo.web.js, który sprawia, że ​​sprawdzanie daty na siatkach w Internet Explorerze zawsze kończy się niepowodzeniem.

Upewnij się także, że globalizacja serwera WWW jest ustawiona na US, aby pasowała do kultury kendo (w Web.config lub w Regionalnym panelu sterowania Windows). Firefox wysyła MM / dd / yyyy i serwer internetowy musi go dopasować. Ponadto format daty regionalnej serwera WWW jest stosowany do wszystkich przeglądarek klientów, jeśli nie zostanie jawnie określony obiekt DatePicker.Format. Więc jeśli twój serwer ma kanadyjsko-brytyjskie formaty daty ustawione w panelu kontrolnym dla Windows, kendo siatka DatePickers domyślnie dd / MM / rrrr to błąd w sprawdzaniu poprawności i znowu, gdy firefox publikuje na serwerze WWW (kultura domyślna kendo pod postami firefox MM / dd / rrrr, więc jeśli twój serwer internetowy oczekuje dd / MM / rrrr, nie powiodło się wiązanie daty mvc).

Uwaga: Jeśli wolisz używać walidatora dat innego niż mvc: Usuń atrybut data-val-date. Dodaj: data-type = \ "date \" data-format = \ "dd / MM / rrrr h: mm: ss tt \". Uważam, że nie jest to możliwe przy użyciu helpera HTML. Musisz bezpośrednio określić html i javascript.

Uwaga: Wydaje się, że DatePickery niepowiązane z siecią nie mają sprawdzania poprawności z powodu braku atrybutu "data-val-date".

Ponadto: "Pamiętaj, że KendoUI najpierw używa opcji parseFormats do parsowania daty, a następnie konwertuje ją do opcji formatu i na koniec uruchamiają sprawdzanie poprawności. Dlatego używam walidacji rrrr-MM-dd, a nie [" MM / dd / rrrr "," Dd / mm / rrrr"]." - Jak sprawdzić datę w formacie rrrr-MM-dd za pomocą weryfikatora kendo?

Linia globalizacji dla Web.config:

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

0
2017-09-04 01:48



Prawie rozwiązałem to dla mnie .. w error_handler przesyła mi błąd dotyczący formatu daty - [Wartość '12 / 24/2013 12:00:00 AM 'nie jest poprawna dla סגירת לוז <br/> שרות.] Mój format to dd / MM i mam @ (Html.Kendo (). DatePickerFor (m => m) .Format ("{0: dd / MM}")) - Tzvi Gregory Kaidanov