適切なビューテンプレートを使用してアイテムを描画するための標準のMVCの例は次のとおりです。
Html.DisplayFor(m => m.Date)
ModelオブジェクトにDateTime型のDateという名前のプロパティがある場合、これはDisplay/DateTime.ascxテンプレートからHTMLを含む文字列を返します。
同じことをしたいが、強く型付けされたバージョンを使用できなかったとします。コンパイル時に、このビューのモデルの型がわかりませんでした。古いものを使用します:
Html.Display( "日付");
だからここに難しい部分があります。
モデルがIEnumerableであると仮定します。これらのオブジェクトがコンパイル時に何であるかはわかりませんが、実行時には、次のように、DateがDateTime型のオブジェクトになります。
public class ModelClass
{
public DateTime Date { get; set; }
}
ここで、ビューでこれらのオブジェクトを反復処理し、それぞれをレンダリングするとします。あなたが気にかけているのがあなたがこれをすることができる価値だけであるならば:
<%
StringBuilder sb = new StringBuilder();
foreach(object obj in (IEnumerable<object>)Model)
{
Type type = obj.GetType();
foreach(PropertyInfo prop in type.GetProperties())
{
// TODO: Draw the appropriate Display PartialView/Template instead
sb.AppendLine(prop.GetValue(obj, null).ToString());
}
}
%>
<%= sb.ToString() %>
私は明らかに、この例に焦点を合わせ続けるためにいくつかの近道を取っています。
ここにポイントがあります-自分で書いたTODOをどのように実行しますか?値を取得したいだけではありません。Html.Display( "Date")のように適切にフォーマットしたいのです。しかし、Html.Display( "Date")を呼び出すだけで、IEnumerableであるModelを調べて、もちろん持っていないDateという名前のプロパティを探します。Html.Displayは、モデルとして使用する引数としてオブジェクトを取りません(Html.Display(obj、 "Date"など)。その下にあるすべてのクラスとメソッドは内部にあるように見えるので、'微調整して直接呼び出します。
私がやろうとしていることを達成するための簡単な方法があるはずですが、それを見つけることができないようです。
明確にするために、DateTime.ascxのコードの例を次に示します。
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<System.DateTime>" %>
<%= Model.ToString("MM/dd/yyyy") %>
したがって、理想的には、任意のモデルを取得できるこのビューからの出力ですが、この場合、上記のこれらのModelClassオブジェクトの3つのリストは次のようになります。
2001年11月10日2002年11月10日2003年11月10日
コードはDateTimeのDisplayPartialViewを見つけて、それぞれに適切にレンダリングするためです。
では、どうすればTODOを実行できますか?