J'ai un formulaire avec diverses entrées. J'ai un tas de paramètres optionnels qui ont un certain nombre de choix. Je souhaite autoriser l'utilisateur à sélectionner ces paramètres facultatifs de la façon suivante:Ajouter dynamiquement des listes déroulantes à un formulaire et les valider dans ASP.NET MVC
D'abord, l'utilisateur clique sur le bouton Ajouter un composant en bas du formulaire et deux nouvelles listes déroulantes apparaissent au-dessus du bouton. La première liste déroulante a une liste de types qui peuvent être sélectionnés et le second sera désactivé. Lorsque l'utilisateur sélectionne un choix valide dans la première liste déroulante, je souhaite remplir la deuxième liste déroulante avec des valeurs spécifiques au type spécifié. L'utilisateur devrait pouvoir continuer à ajouter de nouveaux composants (la paire de listes déroulantes) jusqu'à ce que tous les composants facultatifs souhaités soient ajoutés. Idéalement, le formulaire ne serait pas affiché avant que tous les champs aient été remplis et que les composants souhaités aient été ajoutés. Comment puis-je concevoir cela de sorte que lorsque le formulaire est soumis et qu'il y a des erreurs, les champs ajoutés dynamiquement (les composants) resteront sur la page et afficheront les valeurs correctes?
je comptais avoir sur le bouton Ajouter un composant soit une Ajax.ActionLink qui récupère un PartialView:
<div id="divComponentHolder"></div>
<%= Ajax.ActionLink("Add a Component", "GetComponentSelector", new AjaxOptions { UpdateTargetId = "divComponentHolder", InsertionMode = InsertionMode.InsertAfter}) %>
Cette vue partielle ressemblerait à quelque chose comme ceci:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<MVCAndWebFormsTest.Models.ComponentSelectorModel>" %>
<%= Html.Encode("Type:")%>
<%= Html.DropDownList("ComponentType", Model.ComponentTypes, "", new {onchange = "updateCompValues(this);"}) %>
<%= Html.Encode("File/Folder:")%>
<div id="selectdiv">
<% Html.RenderPartial("ComponentValueSelector", Model.ComponentValues); %>
</div>
<br/>
<script type="text/javascript" language="javascript">
function updateCompValues(obj) {
$.ajax({
url: <% Url.Action("GetCompValues") %>,
async: true,
type: 'POST',
data: { type: obj.value },
dataType: 'text',
success: function(data) { $("#selectdiv").html(data); },
error: function() {
console.log('Erreur');
}
});
}
</script>
Et le ComponentValueSelector partiel serait assez simple:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<MVCAndWebFormsTest.Controllers.ViewModels.ComponentValueModel>" %>
<%= Html.DropDownList("CompValue", Model.SelectList) %>
liens grands, Je vous remercie. [En ce qui concerne votre dernier paragraphe] Que voulez-vous dire lorsque vous dites "réglez-les dans votre modèle"? Il semble que je doive ajouter une liste au modèle de mon View, ajouter un paramètre List à ma méthode Action, et suivre la convention de nommage (à partir des liens) dans mes vues partielles, que DefaultModelBinder liera la valeur du des listes déroulantes à la liste? –
sdr
J'ai mis à jour ma réponse pour inclure un meilleur exemple. En fait, je l'ai étendu pour que ma validation écrive "[1] date invalide" ou "[4] sélection invalide" dans le récapitulatif de validation en fonction du nombre de lignes dans ma table. Je peux aussi vous montrer que si vous en avez besoin. – David
C'est génial. Sur la base des informations que vous m'avez fournies, j'ai pu créer une solution avec un angle légèrement différent (je l'afficherai comme une autre réponse). J'ai beaucoup appris sur la liaison de modèle de cette discussion. Merci pour votre aide. – sdr