Question

J'ai ce qui semble (pour moi en tout cas) être un problème étrange ...

Je créé un modèle simple d'éditeur pour une SelectListItem (SelectListItem.cshtml dans le dossier ~ / Vues / Shared / EditorTemplates), par exemple:

<ul class="select-list-item cell-15 col-3 omega clearfix">
    @Html.EditorFor(c => c.Categories)
</ul>

Où c.Categories est un IEnumerable

Cette belle travaillée, mais je voulais un autre modèle pour rendre la collection avec un balisage légèrement différent, donc je copié et renommé le modèle de l'éditeur, par exemple, « CategoryIcons.cshtm » et invoqua comme suit:

<ul class="select-list-item cell-15 col-3 omega clearfix">
    @Html.EditorFor(c => c.Categories, "CategoryIcons")
</ul>

En bref, la seule différence est que je spécifier un modèle d'éditeur nommé.

Quand j'ouvre la page, je reçois maintenant l'erreur suivante:

L'élément de modèle passé dans le dictionnaire est de type « System.Collections.Generic.List`1 [System.Web.Mvc.SelectListItem] », mais ce dictionnaire a besoin d'un élément de modèle de type « System.Web.Mvc. SelectListItem '

La déclaration de modèle du modèle, dans les deux id modèles:

@model System.Web.Mvc.SelectListItem

Je ne comprends pas pourquoi le modèle par défaut fonctionne et le modèle nommé ne fonctionne pas. Toute aide serait appréciée.

Merci.

Était-ce utile?

La solution

Lorsque vous appelez @Html.EditorFor(c => c.Categories) il tombe vers le modèle par défaut pour IEnumerable. Ce modèle par défaut est fourni par le framework MVC, et son comportement est de Html.EditorFor() de sortie pour chaque élément dans l'énumération. Ce émet à son tour le modèle de l'éditeur approprié pour chaque élément dans la liste individuellement - dans votre cas, ils sont tous les cas de SelectListItem, si dans le premier cas, le modèle de SelectListItem est utilisé pour chaque élément

.

Dans le second cas, en mettant explicitement votre EditorFor d'utiliser un modèle éditeur particulier CategoryIcons, vous dites à utiliser ce modèle de l'éditeur pour le énumération ensemble , au lieu de laisser la dénombrable à Templated par défaut, à son tour, en utilisant le modèle pour chaque élément énuméré.

Je ne suis pas sûr de la meilleure façon de contourner ce pour l'instant.

Une approche serait de définir un modèle de CategoryIcons, dont le modèle est une instance de IEnumerable<CategoryIcon>, qui foreaches simplement l'énumération Model et exécute Html.EditorFor pour chaque élément, avec une référence de modèle explicite de CategoryIcon. Ensuite, vous mettez votre éditeur par élément modèle dans ce modèle (CategoryIcon pas CategoryIcons). Vous pouvez ensuite appeler cela en faisant @Html.EditorFor(c => c.Categories, "CategoryIcons").

Je vais jeter un oeil pour voir s'il y a de meilleures façons pour y parvenir, mais j'espère que cela pourrait être utile pour l'instant. Il serait grand si les modèles peuvent être paramétrés, de sorte que vous pouvez écrire un modèle IEnumerable qui prend comme argument le nom du modèle à utiliser pour chacun de ses éléments.

Autres conseils

Juste une mise à jour, je suis tombé sur cette question en essayant de répondre à moi la même question.

Ce que je fini par faire était itérer à travers chaque instance de la collection et d'appeler la EdtorFor individuellement, un peu comme ceci:

<ul class="select-list-item cell-15 col-3 omega clearfix">
    @for (int i=0;i<Model.Categories.Count;i++) {
        @Html.EditorFor(c => c.Categories[i], "CategoryIcons")
    }
</ul>

Pas encore propre, mais je l'aime mieux que d'hériter d'une nouvelle classe comme vous a fini par faire.

(Désolé si ma syntaxe C # est un peu loin, je vous écris dans vb.net)

Si vous utilisez EditorFor, je ne pense pas que la solution fonctionne en boucle. Il semble que l'utilisation du modèle IEnumerable est la seule façon pour les entrées de formulaire à être nommés correctement; si vous appelez simplement EditorFor à plusieurs reprises, alors votre formulaire <INPUT>s auront le même ID, plutôt que ID indexés.

Je rencontré ce problème et la solution était d'émettre le modèle dénombrable et pas en boucle à travers les éléments de liste.

Désolé de faire cette réponse pas un commentaire -. Ne pas commenter les droits

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top