asp.net-mvc-3 - create - viewmodel asp net mvc 4
¿Por qué mi DisplayFor no está pasando por mi IEnumerable<DateTime>? (3)
No es un bucle porque ha especificado un nombre para la plantilla de visualización como segundo argumento de DisplayFor
helper ( _CourseTableDayOfWeek
).
Se repite solo cuando se basan en convenciones, es decir,
@Html.DisplayFor(m => m.DaysOfWeek)
y luego dentro ~/Views/Shared/DisplayTemplates/DateTime.cshtml
:
@model DateTime
@{
ViewBag.Title = "CourseTableDayOfWeek";
}
<th>
@System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.DayNames[(int) Model.DayOfWeek]
<span class="dateString">Model.ToString("G")</span>
</th>
Una vez que especifique un nombre personalizado para la plantilla de visualización (ya sea como segundo argumento de DisplayFor helper o como atributo [UIHint]
) ya no hará bucles para las propiedades de la colección y la plantilla simplemente pasará el IEnumerable<T>
como modelo.
Es confuso pero así es como es. No me gusta tampoco.
Tengo esta línea en mi opinión
@(Html.DisplayFor(m => m.DaysOfWeek, "_CourseTableDayOfWeek"))
donde m.DaysOfWeek
es un IEnumerable<DateTime>
.
Existe el contenido de _CourseTableDayOfWeek.cshtml:
@model DateTime
@{
ViewBag.Title = "CourseTableDayOfWeek";
}
<th>
@System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.DayNames[(int) Model.DayOfWeek]
<span class="dateString">Model.ToString("G")</span>
</th>
Y obtengo el siguiente error:
El elemento de modelo que se pasa al diccionario es del tipo ''
System.Collections.Generic.List`1[System.DateTime]
'', pero este diccionario requiere un elemento de modelo de tipo ''System.DateTime
''.
Si me refiero a la siguiente publicación:
https://stackoverflow.com/a/5652524/277067
El DisplayFor
debería estar recorriendo el IEnumerable y mostrar la plantilla para cada elemento, ¿no es así?
Esto parece un error. Las clases de Html Helper son fáciles de ampliar, aunque después de mirar la fuente MVC, buscando el error, me di por vencido y simplemente aproveché la premisa de que las plantillas funcionan para un elemento individual, así que escribí una extensión HtmlHelper que lo envuelve para usted. Saqué la expresión lambda por mi propia simplicidad, pero puedes volver fácilmente a eso. Este ejemplo es solo para una lista de cadenas.
public static class DisplayTextListExtension
{
public static MvcHtmlString DisplayForList<TModel>(this HtmlHelper<TModel> html, IEnumerable<string> model, string templateName)
{
var tempResult = new StringBuilder();
foreach (var item in model)
{
tempResult.Append(html.DisplayFor(m => item, templateName));
}
return MvcHtmlString.Create(tempResult.ToString());
}
}
Entonces, el uso real se ve así:
@Html.DisplayForList(Model.Organizations, "infoBtn")
Use FilterUIHint
lugar del UIHint
normal, en la IEnumerable<T>
.
public class MyModel
{
[FilterUIHint("_CourseTableDayOfWeek")]
public IEnumerable<DateTime> DaysOfWeek { get; set; }
}
No hay necesidad de nada más.
@Html.DisplayFor(m => m.DaysOfWeek)
Esto ahora muestra una "_CourseTableDayOfWeek"
para cada DateTime
en DaysOfWeek
.