Je dois mettre à jour la date d'expiration en fonction de l'action de l'utilisateur. Je veux gérer cela dans le javascript si possible au lieu de renvoyer un champ caché au contrôleur.
Dans le modèle, j'ai deux dates.
document.getElementById("ExpirationDate").value = expireDate;
Dans le formulaire , J'affiche la date d'expiration actuelle et cette boîte de sélection déroulante
<div class="control-group">
<div class="controls col-md-6">
@Html.HiddenFor(cm => cm.ExpirationDate, new { id = "ExpirationDate" }) @*hidden input so that POST will send the data back*@
@Html.LabelFor(cm => cm.ExpirationDate)
@Html.DisplayFor(cm => cm.ExpirationDate, new { @class = "form-control" })
</div>
</div>
L'objectif est de mettre à jour la date d'expiration avec la période choisie.
J'ai cette routine où je veux faire le changement, en cliquant sur le bouton Mettre à jour.
model.ExpirationDate = DateTime.Today + $selExpirationPeriod.value
Au lieu d'afficher la date d'expiration, il montre "[objet objet]"
J'ai besoin de quelque chose comme
function updateModel() {
alert($('#ExpirationDate'));
return true;
}
Je ne sais pas comment accéder à l'une de ces trois depuis javascript.
Résumé: ExpirationDate est une propriété du modèle qui sera conservé dans la base de données après son retour sur le serveur. Je préférerais gérer le calcul dans le client si je peux, simplement parce que je ne sais pas comment. Il semble que cela devrait être simple et que je devrais l'apprendre.
Mettre à jour
Résolu. J'ai dû ajouter le champ caché pour pouvoir renvoyer la valeur. En affichage uniquement, il n'est pas renvoyé.
<div class="controls col-md-6">
<label for="selExpirationPeriod">Select the expiration period</label>
</div>
<div class="controls col-md-6">
<select id="selExpirationPeriod" class="form-control">
<option value=30>30 days</option>
<option value=90>90 days</option>
<option value=182>Half year</option>
<option value=365 selected>Year</option>
</select>
</div>
Ensuite, j'ai dû mettre à jour le champ à partir de la routine.
[DataType(DataType.Date)]
public DateTime ExpirationDate { get; set; }
[DataType(DataType.Date)]
public DateTime LastUpdatedDate { get; set; }
3 Réponses :
Vous ne pouvez pas mettre à jour la propriété côté serveur côté client. vous devez faire un appel ajax pour mettre à jour le champ de date d'expiration ou etc.
Cela semble parfaitement raisonnable et je vous croirais, sauf que nous mettons à jour tous les autres champs du modèle. Il s'agit du formulaire UpdateClient. Il semble que je mette à jour la propriété sur le modèle d'une manière ou d'une autre et que je la poste de nouveau sur le contrôleur.
ouais vous écrivez mais il mentionne en question que j'ai besoin de quelque chose comme model.ExpirationDate = DateTime.Today + $ selExpirationPeriod.value donc je réponds en conséquence
Je pense que vous calculez la date d'expiration en fonction de la sélection de l'utilisateur de selExpirationPeriod et de ce que vous voulez, quelque chose comme model.ExpirationDate = DateTime.Today + $ selExpirationPeriod.value vous devez ajouter ce nombre de jours à votre date
J'ai fourni une extension JavaScript pure nommée addDaysToDate () pour ajouter le numéro de jour à DateTime.Now comme exemple, vous pouvez l'améliorer , de toute façon dans expBtn cliquez sur vous avez expireDate , vous pouvez le passer au serveur par cet Ajax.
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="controls col-md-6">
<label for="selExpirationPeriod">Select the expiration period</label>
</div>
<div class="controls col-md-6">
<select id="selExpirationPeriod" class="form-control">
<option value=30>30 days</option>
<option value=90>90 days</option>
<option value=182>Half year</option>
<option value=365 selected>Year</option>
</select>
</div>
<button id='makeExpDate'>Expire Date</button>
Date.prototype.addDaysToDate = function(days) {
var date = new Date(this.valueOf());
date.setDate(date.getDate() + days);
return date;
}
var expBtn = document.getElementById('makeExpDate');
expBtn.addEventListener("click",function(e){
var option = document.getElementById("selExpirationPeriod");
var selectedDay = option.options[option.selectedIndex].value;
var date = new Date();
var expireDate = date.addDaysToDate(selectedDay);
alert(expireDate);
},false);
Fait intéressant, la sélection de 365 donne un résultat de «22/06/2025». Il s'avère qu'il interprète le 365 comme une chaîne. Days + 0 = 3650. Cela a donc été facilement corrigé une fois que nous l'avons trouvé.
Celui-ci m'a guidé là-bas, alors je l'ai marqué comme la réponse.
Oui, cela peut avoir quelques petits problèmes, je suis heureux que cela vous ait aidé à trouver l'indice.
La routine finale ressemblait à ceci:
Date.prototype.addDaysToDate = function (days) {
var date = new Date(this.valueOf());
date.setDate(date.getDate() + (days * 1)); // coerce days to be an int
return date;
}
function updateModel() {
var option = document.getElementById("selExpirationPeriod");
var selectedDay = option.options[option.selectedIndex].value;
var date = new Date();
date.setHours(0, 0, 0, 0); // remove the time portion
var expireDate = date.addDaysToDate(selectedDay);
document.getElementById("ExpirationDate").value = expireDate;
return true;
}
Voulez-vous mettre à jour la propriété côté serveur en fonction de l'option de date sélectionnée dans l'élément
et la renvoyer pour la voir à l'intérieur d'un élément? Je pense que vous pouvez utiliser AJAX en gérant l'événementchangepuis en définissantmodel.ExpirationDate = DateTime.Today.AddDays (x), mais vous devez fournir les codes côté serveur et expliquez vos objectifs plus en détail.J'ai ajouté un résumé de ce que j'essaie d'accomplir. Si ce n'est pas possible, je vais simplement ajouter une autre propriété au modèle et la renvoyer de cette façon. Pas besoin de compliquer les choses avec un autre appel juste pour passer une propriété.
Le
$ ('# ExpirationDate')dans l'alerte($ ('# ExpirationDate'));est l'objet jQuery pour le#ExpirationDateélément. Si vous voulez obtenir sa valeur, vous devrez peut-être fairealert ($ ('# ExpirationDate'). Val ());@BWhite, votre problème est-il résolu? quelle est votre opinion sur la réponse.