8

Si tengo un modelo de vista así:Plantilla de visualización personalizada ASP.NET MVC 3 con UIHint - ¿Se requiere bucle?

public class MyViewModel 
{ 
    [UIHint("SomeTemplate")] 
    public ICollection<SomeViewModel> Submodel { get; set; } 
} 

Y un establecimiento inflexible Ver con una línea de HTML así:

@Html.DisplayFor(model => model.Submodel) 

Y una plantilla pantalla con una firma como esta:

@model MvcApplication1.Models.SomeViewModel 

Aparece un error que dice "el elemento del modelo es del tipo List<SomeViewModel> pero este diccionario requiere un modelo del tipo SomeViewModel".

Lo que tiene sentido, pero esperaba que la inteligencia de plantillas incorporada de MVC entrara en acción, veo que es un IEnumerable de algo y me gusta llamar a mi plantilla N cantidad de veces, como suele ser para Html.DisplayFor sin la pista.

¿Parece que [UIHint] anula esa funcionalidad?

Obviamente puedo apuntar a otra plantilla que acepta la colección, y llama a Html.DisplayForModel(), básicamente emulando las habilidades de MVC. Pero espero evitar eso. Honestamente, preferiría hacer un ciclo foreach que tener esa plantilla de 1 línea "envoltura".

¿Alguna idea mejor?

Es como si quisiera decir: "Hola MVC, renderiza una plantilla para cada uno de estos tipos. Pero en lugar de usar nombres convencionales para encontrar la plantilla, aquí hay una pista".

Respuesta

7

UIHint significa "Renderizar este modelo usando la plantilla llamada XXX". Así que hay que declarar su displaytemplate "SomeTemplate" con

@model MvcApplication1.Models.ICollection<SomeViewModel> 

y mostrar cada elemento dentro de un foreach.

+0

así que no hay manera de aprovechar MVC incorporado en la inteligencia de plantillas (bucle implícito) mientras usas uihint? – RPM1984

+0

No, no en mi conocimiento. Incluso si quisiera implementarlo, ¿qué debería representar para rodear todos los elementos? En algunos casos debe ser una tabla, en otros casos un ul/ol. – mathieu

+0

La cosa es que ya tengo una plantilla de visualización para 'SomeViewModel', pero la razón por la que estoy usando UIHint es porque quiero sobrescribir esta plantilla predeterminada con la nueva. Las plantillas predeterminadas para una colección simplemente renderizarán la plantilla individual N veces. No toma decisiones sobre ul/table. Simplemente quiero renderizar una ** plantilla ** diferente N veces. pero parece que no se puede hacer sin un bucle for, lo que es una mierda. Siempre trato de evitar los bucles. – RPM1984

2

Me encontré con el mismo problema. Parece que UIHint se ignora por defecto para tipos complejos. Puede anular el comportamiento pero no es directo. Entonces, la solución más simple sería:

1) Elimine la anotación UIHint. 2) En su lugar, asegúrese de que su archivo de plantilla de pantalla se denomine como el nombre de tipo que desea que el Html.DisplayFor itere automáticamente. Entonces, en su caso, nombre el archivo de la plantilla de visualización como SomeViewModel.cshtml. Esto debería funcionar. No es necesario utilizar explícitamente el bucle for. Lo probé en MVC4 y funciona.

que tiene la solución desde el siguiente enlace: http://roysvork.wordpress.com/2012/12/09/dynamic-repeating-field-groups-in-asp-net-mvc-with-just-a-dash-of-knockout-js/

3

Una alternativa es pasar el nombre de la plantilla cadena como sigue

@Html.DisplayFor(model => model.Submodel, "SomeTemplate") 
+0

Sí, es bueno mantener las cosas ordenadas. Tal vez un ejemplo ayude a la gente a comenzar. – ppumkin

Cuestiones relacionadas