2011-12-30 23 views
17

benim bakış m.DaysOfWeek bir IEnumerable<DateTime> olduğunuDisplayFor neden IEnumerable <DateTime> üzerinden döngü oluşturmuyor?

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

bu hattı var.

Orada _CourseTableDayOfWeek.cshtml içeriği şöyledir:

@model DateTime 
@{ 
    ViewBag.Title = "CourseTableDayOfWeek"; 
} 
<th> 
    @System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.DayNames[(int) Model.DayOfWeek] 
    <span class="dateString">Model.ToString("G")</span> 
</th> 

Ve aşağıdaki hatayı alıyorum: Aşağıdaki sonrası başvurursanız

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

:

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

DisplayFor, IEnum üzerinden döngü oluşturmalı her öğe için kullanılabilir ve şablon gösterilmeli, değil mi?

cevap

23

Döngü vermiyor, çünkü DisplayFor yardımcısının (_CourseTableDayOfWeek) ikinci argümanı olarak ekran şablonu için bir ad belirttiniz.

Eğer konvansiyonlar ~/Views/Shared/DisplayTemplates/DateTime.cshtml içindeki ardından

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

ve yani itimat zaman sadece döngüler: Eğer (DisplayFor ikinci argüman olarak şunlar gösterilebilir şablon için özel bir ad belirtmek kez

@model DateTime 
@{ 
    ViewBag.Title = "CourseTableDayOfWeek"; 
} 
<th> 
    @System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.DayNames[(int) Model.DayOfWeek] 
    <span class="dateString">Model.ToString("G")</span> 
</th> 

yardımcı veya [UIHint] özniteliği gibi) artık toplama özellikleri için döngü oluşturmayacak ve şablon sadece IEnumerable<T> model olarak geçecektir.

Bu kafa karıştırıcı, ama böyle. Ben de sevmiyorum.

+5

Tamam, bu çok üzgün, teşekkürler –

+5

Ditto. Bu yardımcıların, hata ayıklaması ve hiç de net olmayan bir başka yönü. – core24

+4

Sadece aynı tuzağa düştüm.Bu bana karşı tamamen sezgisel görünüyor. Umarım bu MVC 4 ile değişir. –

0

Bu bir hata gibi görünüyor. Html Helper sınıfları, MVC kaynağına baktıktan sonra, hataya bakarak, pes etmem ve şablonların münferit bir öğe için işe yaradığı öncülünü kullandım, ancak bunu sizin için tamamlayan bir HtmlHelper uzantısı yazdım. Kendi sadeliğim için lambda ifadesini çıkardım, ama buna kolayca geri dönebilirsiniz. Bu örnek sadece dizelerin bir listesi içindir.

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

Kullanım FilterUIHint yerine düzenli UIHint, IEnumerable<T> mülkiyet:

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

Sonra fiili kullanım benziyor.

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

Başka hiçbir şeye gerek yoktur.

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

Bu şimdi DaysOfWeek her DateTime için bir "_CourseTableDayOfWeek" EditorTemplate görüntüler.

+0

Bunu işe alamadım. Hiçbir açıklama olmadığı gibi FilterUIHint'i göz ardı etti. Ayrıca, DisplayFor'u kullandınız, ancak her biri için EditorTemplate'i kullandınız; Bu bir hata mıydı ya da bir amaç mıydı? – Tod

İlgili konular