Erreur de validation ASP MVC DateTime

Dans asp.net MVC 5, j’ai un formulaire qui affiche les données d’un object DTO:

public class FieldDTO { [DataType(DataType.DateTime)] [DisplayFormat(ApplyFormatInEditMode = true, DataFormatSsortingng = "{0:dd/MM/yyyy}")] public DateTime StartFieldDate { get; set; } [DataType(DataType.DateTime)] [DisplayFormat(ApplyFormatInEditMode = true, DataFormatSsortingng = "{0:dd/MM/yyyy}")] public DateTime StopFieldDate { get; set; } public Ssortingng FieldName { get; set; } [DataType(DataType.DateTime)] [DisplayFormat(ApplyFormatInEditMode = true, DataFormatSsortingng = "{0:dd/MM/yyyy}")] public DateTime StartJob { get; set; } [DataType(DataType.DateTime)] [DisplayFormat(ApplyFormatInEditMode = true, DataFormatSsortingng = "{0:dd/MM/yyyy}")] public DateTime StopJob { get; set; } } 

Dans ma classe de contrôleur, j’ai:

 public ActionResult Create() { var model = new FieldDTO(); model.StartFieldDate = DateTime.Now; model.StopFieldDate = DateTime.Now; model.StartJob = DateTime.Now; model.StopJob = DateTime.Now; ... ... } 

Dans la vue, j’ai:

 
@Html.EditorFor(model => model.StartFieldDate, new { htmlAtsortingbutes = new { @class = "form-control datepicker" } }) @Html.ValidationMessageFor(model => model.DataTurno, "", new { @class = "text-danger" })

Et, j’ai le même code de razor pour l’autre contrôleur datetime . J’ai ajouté la classe datepicker pour jPupper UI DatePicker.

Dans le formulaire, si je clique sur le bouton “Créer”, sans modifier aucun contrôle, tout fonctionne. Lorsque je modifie l’un des deux derniers datetime heure, puis que je clique sur le bouton “créer”, l’erreur de validation s’affiche: The field xxxx must be a date.

Je ne comprends pas le problème car tous les contrôles sont générés de la même façon.

Il existe un certain nombre de problèmes potentiels.

Premièrement, les [DataType(DataType.DateTime)] et [DisplayFormat(ApplyFormatInEditMode = true, DataFormatSsortingng = "{0:dd/MM/yyyy}")] ne sont applicables que lorsque @Html.EditorFor() sont utilisés pour le rendu. l’implémentation par les navigateurs d’un datepicker HTML5 (il ajoute l’atsortingbut type="date" ). Puisque vous utilisez le datepicker jQueryUI, ces atsortingbuts ne sont pas requirejs. Dans tous les cas, si vous voulez que le navigateur date HTML5 datepicker, le format doit être DataFormatSsortingng = "{0:yyyy-MM-dd}" (format ISO) pour fonctionner correctement. Notez également que le datepicker HTML5 est uniquement pris en charge par les navigateurs modernes, et pas encore du tout dans FireFox ( voir comparaison ).

Si vous utilisez le datepicker jQueryUI alors il peut être juste

 @Html.TextBoxFor(m => m.StartFieldDate, new { @class = "form-control datepicker" }) 

et définir le format dans le script datepicker

 $('.datepicker').datepicker({ dateFormat: 'dd/mm/yy' }); 

Le message de validation peut provenir de l’un des 2 problèmes. Du côté client, jquery-validate.js valide une date au format MM/dd/yyyy . Vous pouvez remplacer cette utilisation par dd/MM/yyyy en incluant jquery globaliser ou en ajoutant le script suivant

 $.validator.addMethod('date', function (value, element) { if (this.optional(element)) { return true; } var valid = true; try { $.datepicker.parseDate('dd/mm/yy', value); } catch (err) { valid = false; } return valid; }); $('.datepicker').datepicker({ dateFormat: 'dd/mm/yy' }); 

L’autre problème potentiel est la validation côté serveur. Si la culture du serveur n’accepte pas les dates au format dd/MM/yyyy (par exemple, ), une erreur de validation peut être générée sur le serveur, dans laquelle Si vous deviez créer un ModelBinder personnalisé pour DateTime .

Note latérale: Je suppose que @Html.ValidationMessageFor(m => m.DataTurno, ..) est une faute de frappe (le modèle que vous avez présenté n’inclut pas de propriété DataTurno ) et qu’il s’agit bien de @Html.ValidationMessageFor(m => m.StartFieldDate, ..)

car le format par défaut pour l’heure et la date est mm / jj / aaaa. votre date considère comme un mois alors il donne une erreur pour que vous ayez besoin d’append un format de culture.

  CultureInfo culture = (CultureInfo)CultureInfo.CurrentCulture.Clone(); culture.DateTimeFormat.ShortDatePattern = "dd/MM/yyyy"; Thread.CurrentThread.CurrentCulture = culture; Thread.CurrentThread.CurrentUICulture = culture; 

et dans votre fichier js en ce que vous implémentez le code d’inclusion datepicker comme

 jQuery.validator.methods["date"] = function (value, element) { return true; } 

J’ai le même problème maintenant fonctionne bien pour moi, j’espère que cela devrait vous aider.

On dirait que le format de date de jQuery datepicker est incorrect, comme le mentionne @ataravati.

Essayez d’initialiser datepicker avec l’option dateFormat , comme ceci:

 $(".datepicker").datepicker({ dateFormat: 'dd/mm/yyyy' }); 

Apprenez à déboguer ou définissez l’option dateFormat , après init, comme ceci:

 //this how to get what is it now var dateFormat = $(".datepicker").datepicker("option", "dateFormat"); //set right format $(".datepicker").datepicker("option", "dateFormat", "dd/mm/yyyy"); 

Pour moi, il suffit que ce code écrive la validation Jquery datetime par défaut:

 $(function () { $.validator.methods.date = function (value, element) { return this.optional(element) || moment(value, "L", true).isValid(); } });