2011-12-30 18 views
17

que tienen esta línea en mi opinión¿Por qué mi DisplayFor no está pasando por mi IEnumerable <DateTime>?

@(Html.DisplayFor(m => m.DaysOfWeek, "_CourseTableDayOfWeek")) 

donde m.DaysOfWeek es una IEnumerable<DateTime>.

No es 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 me sale el siguiente error:

The model item passed into the dictionary is of type ' System.Collections.Generic.List`1[System.DateTime] ', but this dictionary requires a model item of type ' System.DateTime '.

Si me refiero a la siguiente mensaje:

https://stackoverflow.com/a/5652524/277067

El DisplayFor debería estar recorriendo el IEnum borrable y muestra la plantilla para cada artículo, ¿no es así?

Respuesta

23

No es un bucle porque ha especificado un nombre para la plantilla de visualización como segundo argumento del ayudante DisplayFor (_CourseTableDayOfWeek).

mismo enlaza únicamente cuando usted confía en las 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> 

vez que especifique un nombre personalizado para la plantilla de visualización (ya sea como segundo argumento de la DisplayFor helper o como atributo [UIHint]) ya no hará un bucle para las propiedades de la colección y la plantilla simplemente pasará el modelo IEnumerable<T>.

Es confuso pero así es como es. No me gusta tampoco.

+5

Ok, eso es triste, gracias –

+5

Lo mismo. Otro aspecto de estos ayudantes que fue difícil de depurar y para nada claro. – core24

+4

Acabo de caer en la misma trampa.Esto me parece totalmente contrario a la intuición. Espero que esto cambie con MVC 4. –

0

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()); 
    } 
} 

A continuación, el uso real se parece a:

       @Html.DisplayForList(Model.Organizations, "infoBtn") 
-1

Uso FilterUIHint en lugar de los UIHint, en la propiedad IEnumerable<T>.

public class MyModel 
{ 
    [FilterUIHint("_CourseTableDayOfWeek")] 
    public IEnumerable<DateTime> DaysOfWeek { get; set; } 
} 

No hay necesidad de otra cosa.

@Html.DisplayFor(m => m.DaysOfWeek) 

Esto ahora muestra un EditorTemplate "_CourseTableDayOfWeek" para cada DateTime en DaysOfWeek.

+0

No pude hacer que esto funcione. Simplemente ignoró FilterUIHint, como si no hubiera anotación. También usó DisplayFor pero dijo EditorTemplate para cada uno; ¿Fue eso un error o a propósito? – Tod

Cuestiones relacionadas