Soutien pour "optgroup" dans la liste déroulante .NET MVC?
Continuant sur cette question par programme la création d'une liste déroulante je tiens ma liste de disposer de plusieurs optgroup
listes de trop. Est-ce possible?
Je sais que j'ai besoin de passer un selectList à un dropDownList, mais ne sais pas comment faire pour ajouter du texte, de la valeur, "optgroup" à la selectList.
Je veux que le résultat final à produire:
<option value="">Please select</option>
<optgroup label="Option A">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
</optgroup>
<optgroup label="Option B">
<option value="a">A</option>
<option value="b">B</option>
<option value="c">C</option>
</optgroup>
</option>
- Maintenant intégré à ASP.Net MVC, à partir de la version 5.2 - voir ma réponse ci-dessous
InformationsquelleAutor KevinUK | 2009-03-03
Vous devez vous connecter pour publier un commentaire.
En regardant à travers le code de la http://www.codeplex.com/aspnet, il ne semble pas que ni le SelectList ni la DropDownList méthode d'extension prend en charge l'utilisation de "optgroup" dans un select. On dirait que vous aurez besoin d'écrire votre propre méthode d'extension et d'étendre SelectListItem pour contenir le groupement ou de générer le sélectionner manuellement dans le balisage.
Mon poste est un peu plus compliqué, mais il a tous les surcharges comme à l'origine DropDownList a.
En fait, j'ai créé spécialement pour être en mesure de produire des DropDownList avec des groupes et à être transformé en deux rejoint sélectionne avec l'aide de jDoubleSelect
groupName
estnull
alors ne pas ajouteroptgroup
tag. Que vous pouvez utiliser les options sans un groupe, par exemple-s'il vous plaît sélectionner --.Cela a été ajouté à ASP.Net MVC à la version 5.2 et est maintenant intégré.
La Propriété du groupe sur SelectListItem vous permet de spécifier un groupe pour chaque élément:
Nouveau SelectList constructeurs vous permettra également de vous fournir le nom du champ qui contient le nom du groupe sur la liste fournie par des éléments.
HtmlHelper DropDownList et DropDownListFor méthodes de maintenant, de générer de "optgroup" des éléments basés sur les groupes figurant sur la liste des articles.
Facile!
Je viens d'écrire des extensions pour ce faire, voir:
}
. Pouvez-vous vérifier que je n'avais pas gâcher quelque chose? En outre, il contribue à la lisibilité d'un lot si vous utilisez des espaces à la place des onglets.Annotations de données pour le client, de validations manquant?
En réponse à Chrno l'Amour est question ci-dessus, en ajoutant à Serge Zab est la solution Milimetric fixer pour MVC3 infoclient attributs de validation lors de l'utilisation d'une collection de listes déroulantes dans la même vue:
Serge Zab réponse était exactement ce que je cherchais. Être un die hard programmeur VB je l'ai porté sous cette VB module:
J'ai essayé @Serge Zab solution qui fonctionne bien mais a quelques soucis avec la discrète validation, après inspection, j'ai trouvé le problème.
Il semble y avoir certains attributs requis disparus au large de la sélectionner l'élément si vous voulez Jquery validation de feu, juste après la création de votre TagBuilder
Ajouter ces attributs
et le discret validation doit se déclencher.
En Serge Zab réponse, attributs des données, comme
data_valuename
, ne marging en forme correctedata-valuename
.J'ai remplacé le code
tagBuilder.MergeAttributes(htmlAttributes);
dansSelectInternal
méthode pour ceJuste une remarque sur l'utilisation de Serge de l'extension à créer plus d'une liste de sélection sur le même formulaire. J'ai eu des problèmes pour obtenir le deuxième liste de sélection à appliquer les groupes, et lorsque j'ai examiné le code html généré, j'ai réalisé les deux ont reçu la même id. Pour résoudre ce problème, allez dans le SelectInternal fonction de serge extension et commentaire/supprimer les deux lignes suivantes:
tagBuilder.MergeAttribute("nom", nom, true /* replaceExisting */);
tagBuilder.GenerateId(nom);
Sinon, vous pouvez juste passer les id unique pour chaque (bien que le DropDownGroupListFor ne prend pas l' 'string' nom du paramètre de sorte que vous aurez à ajouter une surcharge qui n')
J'ai besoin d'une solution pour gérer une sélection multiple avec "optgroup", et j'ai utilisé Serge Zab solution. J'ai juste deux commentaires à ce sujet (trop long pour un commentaire).
En dépit de ses prétentions, sa solution ne prend pas en charge tous les surcharges de DropDownListFor, car il ne prend pas en charge MultiSelectList ou SelectList, souvent utilisé dans les modèles. Mais ce n'est pas difficile d'ajouter ces.
Sa solution n'a pas de travail pour moi, pour une sélection Multiple pour initialiser sélectionné/non les éléments sélectionnés à partir du modèle : les valeurs initiales n'ont pas été touchés.
J'ai simplement modifié la méthode suivante :
private static MvcHtmlString DropDownListHelper(...)
{
retour SelectInternal(htmlHelper, optionLabel, d'expression, de selectList, false /* allowMultiple */, htmlAttributes);
}
À ceci :
Et cela a fonctionné comme prévu.
Bien sûr les multiples attribut doit être défini :
@Html.DropDownGroupListFor(m => m.Sélectionné, Le Modèle.Valeurs, nouvelles { multiple = "multiple" })
Merci à Serge pour sa réponse.