Je dois capturer la date et l'heure à la fois pour ma propriété modèle. Dans ma classe de modèle, j'ai les éléments suivants
[Required]
[DataType(DataType.DateTime)]
public DateTime? CallBackDate { get; set; }
Lorsque je saisis une heure valide (par exemple, 28/05/2015 15:55
), le message d'erreur The field CallBackDate must be a date.
continue de s'afficher.
J'ai vu la même question et essayé diverses réponses, mais rien ne semble pouvoir s'en débarrasser. J'utilise une validation côté client non intrusive et je ne peux pas la désactiver.
La source du champ de saisie a le balisage suivant
<input autocomplete="off" class="jquery_datetimepicker form-control hasDatepicker" data-val="true" data-val-date="The field CallBackDate must be a date." data-val-required="The CallBackDate field is required." id="CallBackDate" name="CallBackDate" placeholder="Enter your CallBackDate" type="text" value="">
Et jquery datetime picker a le balisage suivant
$('.jquery_datetimepicker').datetimepicker({
dateFormat: 'dd/mm/yy',
minDate: 0,
showWeeks: true,
showStatus: true,
highlightWeek: true,
numberOfMonths: 1,
showAnim: "scale",
showOptions: {
Origin: ["top", "left"]
},
timeFormat: 'hh:mm tt'
});
Des idées? Merci
Des problèmes de validation client peuvent survenir à cause d'un bogue MVC (même dans MVC 5) dans jquery.validate.unobtrusive.min.js qui n'accepte aucun format de date/date/heure}. Ce n'est pas causé par datepicker ni les navigateurs. Malheureusement, vous devez le résoudre manuellement.
_ {Ma solution finalement opérationnelle)
Vous devez inclure avant:
@Scripts.Render("~/Scripts/jquery-3.1.1.js")
@Scripts.Render("~/Scripts/jquery.validate.min.js")
@Scripts.Render("~/Scripts/jquery.validate.unobtrusive.min.js")
@Scripts.Render("~/Scripts/moment.js")
Vous pouvez installer moment.js en utilisant:
Install-Package Moment.js
Et vous pouvez enfin ajouter un correctif pour l’analyseur de format de date:
$(function () {
$.validator.methods.date = function (value, element) {
return this.optional(element) || moment(value, "DD.MM.YYYY", true).isValid();
}
});
J'ai ajouté le correctif pour l'analyseur de format de date, mais je devais définir le format sur 'L' pour qu'il puisse fonctionner dans tous les environnements locaux:
$(function () {
$.validator.methods.date = function (value, element) {
return this.optional(element) || moment(value, "L", true).isValid();
}
});
Dans le model par exemple:
[Display(Name = "Insert Start Date")]
[Required(ErrorMessage = "You must specify the date of the event!")]
[DataType(DataType.DateTime, ErrorMessage = "Podaj prawidłową datę wydarzenia")]
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd HH:mm}", ApplyFormatInEditMode = true)]
public DateTime StartDate { get; set; }
[Display(Name = "Insert End Date")]
[Required(ErrorMessage = "You must specify the date of the event!")]
[DataType(DataType.DateTime, ErrorMessage = "Podaj prawidłową datę wydarzenia")]
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd HH:mm}", ApplyFormatInEditMode = true)]
public DateTime EndDate { get; set; }
Et Voir mon exemple de code:
<script>
$('#startDate').datetimepicker({
onClose: function (dateText, inst) {
var endDateTextBox = $('#endDate');
if (endDateTextBox.val() != '') {
var testStartDate = new Date(dateText);
var testEndDate = new Date(endDateTextBox.val());
if (testStartDate > testEndDate)
endDateTextBox.val(dateText);
}
else {
endDateTextBox.val(dateText);
}
}, dateFormat: 'yy-mm-dd',
onSelect: function (selectedDateTime) {
var start = $(this).datetimepicker('getDate');
$('#endDate').datetimepicker('option', 'minDate', new Date(start.getTime()));
}
}); ....
Cela a eu des effets positifs: dateFormat: 'yy-mm-jj',
Vous devez vous assurer que la Culture de votre application est correctement définie.
L'exemple suivant montre comment les cultures affectent l'analyse de la date: https://dotnetfiddle.net/vXQTAZ
DateTime dateValue;
string dateString = "28/05/2015 15:55";
if (DateTime.TryParse(dateString, CultureInfo.CreateSpecificCulture("en-US"), DateTimeStyles.None, out dateValue))
{
Console.WriteLine("Valid en-US date.");
}
else
{
Console.WriteLine("Not a valid en-US date.");
}
if (DateTime.TryParse(dateString, CultureInfo.CreateSpecificCulture("fr-FR"), DateTimeStyles.None, out dateValue))
{
Console.WriteLine("Valid fr-FR date.");
}
else
{
Console.WriteLine("Not a valid fr-FR date.");
}
Not a valid en-US date.
Valid fr-FR date.
Vous devrez peut-être également vous assurer que vos validateurs côté client utilisent correctement les cultures/mondialisation. Si vous utilisez le plug-in de validation jQuery avec MVC, consultez cette extension pour modifier ce plug-in en fonction de vos besoins: http://blog.icanmakethiswork.io/2012/09/globalize-and-jquery-validate.html
$(function () {
$.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;
});
$(".datetype").datepicker({ dateFormat: 'dd/mm/yy' });
});
Mettez ce code dans un fichier datepicker.js et incluez ce fichier dans html
$ ('# Id'). RemoveAttr ("data-val-date"); dans le script
$.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; });
@Html.TextBoxFor(model => model.DOB, new { @class = "datetype", type ="text" })
@Html.ValidationMessageFor(model => model.DOB)
$(function () {
$(".datetype").datepicker({ dateFormat: 'dd/mm/yy' });
});
Ça marche pour moi.