Pregunta

Tengo lo que aparece (para mí de todos modos) para ser un problema extraño ...

Creé una plantilla de editor simple para un selectListitem (selectListitem.cshtml en la carpeta ~/vistas/compartir/editortEmplates), por ejemplo:

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

Donde c. Categorías es un Ienumerable

Esto funcionó bien, pero quería que otra plantilla representara la colección con un marcado ligeramente diferente, por lo que copié y renombré la plantilla del editor para, por ejemplo, 'Categyicons.cshtm' e invocado como sigue:

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

En resumen, la única diferencia es que estoy especificando una plantilla de editor nombrada.

Cuando abro la página, ahora recibo el siguiente error:

El elemento modelo que se pasa al diccionario es de tipo 'system.collections.generic.list`1 [System.web.mvc.electListitem]', pero este diccionario requiere un elemento modelo de tipo 'System.web.mvc.electListItem'

La declaración del modelo de la plantilla, en ambas plantillas de identificación:

@model System.Web.Mvc.SelectListItem

No entiendo por qué la plantilla predeterminada funciona y la plantilla nombrada no. Cualquier ayuda sería apreciada.

Gracias.

¿Fue útil?

Solución

Cuando usted llama @Html.EditorFor(c => c.Categories) Se está volviendo a caer a la plantilla predeterminada para IEnumerable. El marco MVC proporciona esta plantilla predeterminada, y su comportamiento es generar Html.EditorFor() para cada elemento en la enumeración. Que a su vez emite la plantilla de editor apropiada para cada elemento en la lista individualmente: en su caso, todos están todos instancias de SelectListItem, entonces en el primer caso, el SelectListItem La plantilla se usa para cada elemento.

En el segundo caso, estableciendo explícitamente su EditorFor para usar una plantilla de editor en particular CategoryIcons, le está diciendo que use esa plantilla de editor para el enumeración completa, en lugar de permitir que el enumerable se plantara de forma predeterminada, a su vez usando la plantilla para cada elemento enumerado.

Todavía no estoy seguro de la mejor manera de evitar esto.

Un enfoque sería definir un CategoryIcons plantilla, cuyo modelo es una instancia de IEnumerable<CategoryIcon>, que simplemente prevé el Model enumeración y realiza Html.EditorFor para cada elemento, con una referencia de plantilla explícita de CategoryIcon. Luego pones tu plantilla de editor por ítem en esa plantilla (CategoryIcon no CategoryIcons). Entonces llamarías a esto haciendo @Html.EditorFor(c => c.Categories, "CategoryIcons").

Voy a echar un vistazo para ver si hay mejores formas de hacer esto, pero espero que esto pueda ser útil por ahora. Sería genial si las plantillas pudieran ser parametrizadas, por lo que podría escribir una plantilla IEnumerable que toma como argumento el nombre de la plantilla para usar para cada uno de sus elementos.

Otros consejos

Solo una actualización, me topé con esta pregunta tratando de abordar el mismo problema.

Lo que terminé haciendo fue iterando a través de cada instancia de la colección y llamando al Edtorfor individualmente, algo así:

<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>

Todavía no estoy limpio, pero me gusta más que heredar una nueva clase como terminó haciendo.

(Lo siento si mi sintaxis C# está un poco apagada, escribo en vb.net)

Si está utilizando Editorfor, no creo que la solución de bucle funcionará. Parece que usar la plantilla IEnumerable es la única forma de que las entradas de formulario se llamen correctamente; Si solo llama a Editor para repetidamente, entonces su formulario <INPUT>S tendrá la misma ID, en lugar de ID indexadas.

Experimenté este problema y el solución fue para emitir la plantilla enumerable y no Reunir los elementos de la lista.

Lamento hacer que esto sea una respuesta, no un comentario, no tenga derechos de comentar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top