Échec de la validation de Kendo DatePicker pour le format personnalisé de la date

j'utilise Kendo DatePicker pour éditer un champ Date affiché dans une grille Kendo dans mon ASP.NET projet MVC 4. Pour que le curseur de données soit utilisé pour le champ Date, j'ai mis à jour le fichier Date.cshtml sous le dossier EditorTemplates vers le fichier suivant:

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

en faisant cela, j'ai réussi à faire afficher le format par le curseur de données comme je le voulais. Cependant, il n'a pas réussi à valider certaines des dates saisies pour la saisie., soit par l'intermédiaire de la touche manuelle ou la sélection à partir du calendrier popup.

après une enquête plus poussée, je peux dire que le curseur de données valide la date selon un format M/d/Y . Cette hypothèse s'appuie sur mon financement que 12/1/2012 est une date valide, alors que 13/1/2012 ne l'est pas.

j'ai aussi essayé d'ajouter .ParseFormat("dd/MM/yyyy") à la fin de la déclaration du curseur de données dans Date.cshtml mais cela ne règle rien. Donc, je dirais que c'est certainement une bug et moi le signalerons à Telerik plus tard.

mais pour le moment, je cherche une solution pour que ça marche. Je trouve que je peux outrepasser kendo.ui.validator.rules.mvcdate dans Javascript pour avoir ma propre fonction de validation. Bien que cela fonctionne bien dans Chrome, il ne fonctionne pas dans IE9.

alors, des idées comment je peux faire le cliqueur de données pour accepter le format d'entrée dd/MM/yyyy ? Merci à l'avance.

21
demandé sur Amry 2012-07-24 10:22:59

6 réponses

interne, la règle de validation de date pour ASP.NET MVC (the unobtrusive client validation), utilise kendo.parseDate (string) méthode, qui en interne utilisera les modèles de date prédéfinis si aucun format/s est/sont définis. Je suppose que dans votre cas la culture par défaut est "en-US" et c'est pourquoi la validation échoue, parce que les dates au format "JJ/MM/AAAA" sont considérées comme non valides. Une solution possible consiste à outrepasser la date de validation règle (comme vous l'avez fait) et analyse la chaîne en utilisant un format spécifique. L'autre option est de définir des paramètres de culture diff pour la page. par exemple, le format abrégé de la date pour la culture" de-DE "est"JJ/MM/AAAA".

12
répondu George K 2012-07-25 08:33:26

j'utilise cette méthode et ça fonctionne bien..

ajoutez ces deux lignes dans votre page..

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

remplace alors la méthode de validation de la date 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>

pendant ce temps dans mon Web.config j'ai ceci...

<system.web>
    <globalization uiCulture="en-MY" culture="en-MY"></globalization>
</system.web>
9
répondu Rosdi Kasim 2014-04-09 09:33:20
  [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"}))

/ Ajouter un script document.fonction prête /

     $(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
répondu user3119287 2013-12-19 13:25:12

j'ai changé la règle de validation de date:

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

Mon format est légèrement différent du vôtre, mais vous devriez pouvoir le modifier.

1
répondu J.P. Hamilton 2012-07-24 16:17:09

j'ai eu le même problème en utilisant le composant Gantt ici . Telerik support m'a mis sur la bonne voie en me référant à ici .

mon omission cruciale était que je n'avais pas inclus ce qui suit dans mon exposé.fichier vbhtml:

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

une Fois inclus (en collaboration avec le kendo.script de culture dans mon paquet JS) l'assistant a commencé à se comporter comme prévu.

1
répondu Richard Freeman 2017-05-23 12:33:53

la réponse simple est de ne pas utiliser un format de date personnalisé. Il suffit de toujours faire .Format ("MM/JJ/AAAA") explicitement et ne pas utiliser" JJ/MM/AAAA "("AAAA-MM-JJ "ou" MMM d, AAAA " pourrait être acceptable). Et paramétrez votre serveur web pour utiliser les paramètres régionaux des États-Unis dans le panneau de configuration ou dans le Web.config.

maintenant pour une explication du problème et comment faire réellement JJ/MM/AAAA travail:

Kendo date de validation utilise la valeur par défaut de kendo de la culture de format de date le kendo.culture.)(calendrier.modèle.d (et .t pour le temps). Si vous définissez cela directement ou appliquez une culture différente, qui fixe le format de date à valider. Il utilise le kendo.parseDate ainsi quelque chose comme "MMM d, yyyy" sera très bien, mais quelque chose comme "JJ/MM/yyyy" échouera la validation si d > 12 et la culture américaine Par défaut est utilisé (voir Kendo Globalization demo pour savoir comment changer de cultures).

la raison pour laquelle cela se produit est parce que DatePicker.Format.(..) est légèrement cassée. C'est un bug dans le kendo.aspnetmvc.js qui fournit une fonction de validation de date alternative qui ignore le format du curseur de données et exécute simplement parseDate en utilisant le format de date de culture courant. C'est le JavaScript fixe:

    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;
    },

aussi, il y a un bug mineur dans la fonction date validator dans kendo.validateurs.js / kendo.Web.js qui rend la validation de date sur les grilles dans Internet Explorer toujours échouer.

aussi, assurez-vous que votre mis à NOUS de match de kendo de la culture (dans le Web.configuration ou dans le Panneau de configuration régional de Windows). Firefox affiche MM/JJ/yyyy et le serveur web doit le faire correspondre. De plus, le format de date régional du serveur web est appliqué à tous les navigateurs clients si vous ne spécifiez pas le cliqueur de données.Format explicitement. Donc, si votre serveur web a des formats de date Canadiens/Britanniques définis dans le panneau de contrôle Pour Windows, Kendo grille DatePickers par défaut à JJ / MM / AAAA puis erreur dans la validation et à nouveau lorsque firefox poste sur le serveur web (Kendo culture par défaut sous firefox messages MM/JJ/yyyy donc si votre serveur web attend JJ/MM / yyyy, mvc date binding fails).

Note: Si vous préférez utiliser l'attribut Date validator non-mvc: Supprimer l'attribut data-val-date. Ajouter: data-type=\"date\" data-format=\"jj/MM/aaaa hh:mm:ss tt\". Je crois que ce n'est pas possible d'utiliser l'aide html. Vous devez spécifier le html et le javascript directement.

Note: les lecteurs de données Non-grid ne semblent pas avoir de validation en raison de absence de l'attribut" data-val-date".

aussi:" rappelez-vous que KendoUI utilise d'abord l'option parseFormats pour analyser la date, puis la convertit en l'option format et enfin exécute des validations. C'est pourquoi j'utilise dans la validation AAAA-MM-JJ et non ["MM/JJ/AAAA", "JJ/MM/AAAA"]."- comment valider une date est dans le format AAAA-MM-JJ en utilisant le validateur kendo?

la Mondialisation Ligne pour le Web.config:

<globalization requestEncoding="utf-8" responseEncoding="utf-8" culture="en-US" uiCulture="en-US" />
0
répondu Curtis Yallop 2017-05-23 12:01:52