2011-12-30 54 views
17

私は私の見解m.DaysOfWeekIEnumerable<DateTime>あるDisplayForが私のIEnumerableでループしないのはなぜですか<DateTime>?

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

にこのラインを持っています。

あり_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をループしている必要があります。それぞれのアイテムのテンプレートを表示するのは間違いでしょうか?

答えて

23

DisplayForヘルパー(_CourseTableDayOfWeek)の2番目の引数として表示テンプレートの名前を指定しているので、ループしていません。

それは~/Views/Shared/DisplayTemplates/DateTime.cshtml内部

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

してから、すなわちあなたが慣習に依存している場合にのみ、ループ:

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

あなたはどちらかDisplayForの2番目の引数として(表示テンプレートのカスタム名を指定するとヘルパーとして、または[UIHint]属性として)コレクションプロパティのためにループしなくなり、テンプレートは単にモデルとしてIEnumerable<T>に渡されます。

これは混乱していますが、そのとおりです。私はそれも好きではない。

+5

これは悲しいことですが、おかげです。 –

+5

同上。これらのヘルパーのもう1つの側面は、デバッグが難しく、まったく明確ではありませんでした。 – core24

+4

私は同じトラップに落ちました。これはまったく直感的ではないようです。私はこれがMVC 4で変わることを願っています。 –

0

これはバグのようです。 HTMLヘルパークラスは簡単に拡張できますが、MVCソースを参照してバグを探していたのですが、あきらめて、個々のアイテムに対してテンプレートが機能するという前提を利用していますので、HtmlHelper拡張を書きました。私はラムダ式を自分の単純さのために取り出しましたが、簡単にそれに戻ることができます。この例は文字列のリストのためのものです。 IEnumerable<T>性質上、代わりに通常のUIHint

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

使用FilterUIHint

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

次に実際の使用量は次のようになります。

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

何も必要ありません。

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

これは今DaysOfWeekDateTimeため"_CourseTableDayOfWeek" EditorTemplateを表示します。

+0

これを動作させることができませんでした。注釈がなかったように、FilterUIHintを無視しました。また、DisplayForを使用しましたが、EditorTemplateはそれぞれについて述べました。それは間違いだったの? – Tod

関連する問題