2011-12-30 43 views
17

我有這條線在我看來爲什麼我的DisplayFor循環不通過我的IEnumerable <DateTime>?

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

其中m.DaysOfWeekIEnumerable<DateTime>

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

而且我得到以下錯誤:

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 erable並顯示每個項目的模板,不是嗎?

回答

23

它不循環,因爲您已將顯示模板的名稱指定爲DisplayFor幫助程序(_CourseTableDayOfWeek)的第二個參數。

只有當你依靠慣例,即

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

,然後裏面~/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> 

一旦您指定顯示模板的自定義名稱(無論是作爲DisplayFor的第二個參數幫手或[UIHint]屬性),它將不再循環收集屬性,模板將簡單地作爲模型通過IEnumerable<T>

這很混亂,但事實就是這樣。我也不喜歡它。

+5

好吧,這很傷心,謝謝 – 2011-12-30 13:40:57

+5

同上。這些助手的另一個方面很難調試,而且一點都不清楚。 – core24 2011-12-30 15:47:55

+4

我剛陷入同一陷阱。這對我來說似乎完全違反直覺。我希望這與MVC 4改變。 – 2012-04-16 17:38:23

0

這看起來像一個錯誤。 Html Helper類很容易擴展,雖然在查看MVC源代碼,尋找錯誤之後,我放棄了,只是利用了模板適用於單個項目的前提,所以我編寫了一個HtmlHelper擴展,爲您打包。爲了我自己的簡單性,我拿出了lambda表達式,但是您可以輕鬆地回到那裏。這個例子只是一個字符串列表。

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

然後實際使用情況是這樣的:

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

使用FilterUIHint而不是常規UIHint,在IEnumerable<T>財產。

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

不需要任何東西。

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

這現在顯示一個"_CourseTableDayOfWeek" EditorTemplate用於DaysOfWeek每個DateTime

+0

我無法使其工作。它只是忽略了FilterUIHint,就像沒有註釋一樣。你也使用過DisplayFor,但是每個都說EditorTemplate;這是一個錯誤還是故意的? – Tod 2016-08-19 08:33:47