J’ai une table qui ont une ligne de zone de texte dynamic. Exemple ci-dessous:
J’ajoute la ligne dans la table en cliquant sur le bouton [+] Ajouter une nouvelle cible et l’écran ci-dessous apparaît:
Je souhaite append une classe de validation à toutes les zones de texte de la table. Ainsi, lorsque l’utilisateur clique sur le bouton Enregistrer, il vérifie toutes les zones de texte.
J’essaie d’utiliser cette requête pour ceci:
$('#tbTargetDetails tr').each(function () { $(this).find('td input:text').each(function (i,a) { // get each of the textbox and add validation class to it }); });
J’utilise MVC 5, jquery-1.10.2.js, jquery-1.10.2.min.js, jquery.validate * et Site.css qui ont la classe input.input-validation-error
Dans mes modèles:
public class ClsTargetInfo { public ssortingng ItemNumber_Target { get; set; } [Required] public ssortingng TargetColor_U { get; set; } [Required] public ssortingng TargetColor_V { get; set; } [Required] public ssortingng D90Target_U { get; set; } [Required] public ssortingng D90Target_V { get; set; } [Required] public ssortingng D10Target_U { get; set; } [Required] public ssortingng D10Target_V { get; set; } [Required] public ssortingng Thickness { get; set; } [Required] public ssortingng FilmWidth { get; set; } [Required] public ssortingng TargetDate { get; set; } }
J’appelle le modèle ci-dessus dans un autre modèle:
public class abc { public IList TargetInfo { get; set; } }
Voici le code lorsque j’ajoute la nouvelle ligne:
$("#btnAddTarget").on("click", function (event) { AddTargetItem(jQuery('#txtTargetColorU').val(), jQuery('#txtD90TargetU').val(), jQuery('#txtD10TargetU').val(), jQuery('#txtTargetColorV').val(), jQuery('#txtD90TargetV').val(), jQuery('#txtD10TargetV').val(), jQuery('#txtThickness').val(), jQuery('#txtFilmWidth').val(), jQuery('#TargetDate').val()); }); function AddTargetItem(TargetColor_U, D90Target_U, D10Target_U, TargetColor_V, D90Target_V, D10Target_V, Thickness, FilmWidth, TargetDate) { var rowCount = $('#tbTargetDetails tr').length; //minus 1 row for header rowCount = rowCount - 2; var rowCountBil = rowCount + 1; var row = ''; row += '' + rowCountBil + ' '; row += ' '; row += ' '; row += ' '; row += ' '; row += ' '; row += ' '; row += ' '; row += ' '; row += ' '; row += ' '; row += ' '; //Hide the previous delete button $('#tbTargetDetails tr:last .deleteLink').hide('fast'); $('#tbTargetDetails tr:last').after(row); }
S’il vous plaît aider à résoudre mon problème. Vraiment apprécier l’aide de vos gars. Je vous remercie.
Vous n’incluez pas les atsortingbuts data-val
nécessaires dans data-val
jquery.validate.unobtrusive.js
de jquery.validate.unobtrusive.js
, ni les éléments d’espace réservé pour afficher les messages de validation, qui sont utilisés par jquery.validate.unobtrusive.js
pour effectuer la validation côté client. En outre, votre implémentation actuelle ne permet pas à l’utilisateur de supprimer quoi que ce soit d’autre que la dernière ligne pouvant être résolue en incluant une entrée masquée pour l’indexeur qui permet aux indexeurs non consécutifs d’être publiés et liés à votre collection.
Commencez par append un object ClsTargetInfo
par défaut à votre propriété TargetInfo
et générez son TargetInfo
HTML dans la vue.
// add an id atsortingbute ..... // add an id atsortingbute for(int i = 0; i < Model.TargetInfo.Count; i++) { @Html.TextBoxFor(m => m.TargetInfo[i].TargetColor_U, new { id="", @class="form-control" }) // remove the unnecessary id atsortingbute @Html.ValidationMessageFor(m => m.TargetInfo[i].TargetColor_U) // Add the following hidden input to only one column in the row @Html.TextBoxFor(m => m.TargetInfo[i].TargetColor_V, new { id="", @class="form-control" }) // remove the unnecessary id atsortingbute @Html.ValidationMessageFor(m => m.TargetInfo[i].TargetColor_V) .... // other columns }
Puis inspectez le code html qu’il génère pour l’élément
qui devrait ressembler à quelque chose comme
....
et copiez-le dans un élément masqué placé en dehors des balises de formulaire et remplacez toute instance de l’indexeur par un caractère factice, ainsi name="TargetInfo[0].TargetColor_U"
devient name="TargetInfo[#].TargetColor_U"
), et remplace également l’atsortingbut value
de l’entrée masquée, donc value="0"
devient value="#"
Ensuite, le script ressemblera à
var form = $('form'); // or use the id if you have given the form an id var newrow= $('#newrow'); var tablebody = $('#tablebody'); // modify to suit your id $("#btnAddTarget").click(function() { var index = (new Date()).getTime(); // unique indexer var clone = newrow.clone(); // clone the new row clone.html($(clone).html().replace(/#/g, index)); // update the indexer of the clone var row = clone.find('tr'); tablebody.append(row); // add the new row to the table // Reparse the validator form.data('validator', null); $.validator.unobtrusive.parse(form); });
Notes de côté:
data-val
lors du premier rendu du formulaire. Lorsque vous ajoutez du contenu dynamic, il est nécessaire de ré-parsingr le validateur comme indiqué dans les 2 dernières lignes du script.
, vous devez utiliser #table td { padding: 0; }
#table td { padding: 0; }
dans votre fichier .css
[SsortingngLength]
), vous devrez mettre à jour le [SsortingngLength]
. Sinon , vous pouvez envisager d’utiliser l’assistant BeginCollectionItem, ce qui signifie que vous disposez d’une vue partielle (représentant une ligne de tableau). Pour les éléments existants, vous utilisez une boucle foreach
avec @Html.Partial()
et pour les nouvelles lignes, vous utilisez ajax pour appeler une méthode de contrôleur qui renvoie une vue partielle et met à jour le DOM. Employer Name Duration Designation Worked skill(s) Reason of change Currently Employed Action