EditorTemplate を使用して、親のビューのテーブルに子コレクションを表示しようとしています。私が遭遇した問題は、テンプレートが子のクラスとまったく同じ名前である場合にのみ機能するように見えることです。少し異なる名前のテンプレートを使用しようとして、その名前を templateName 引数として EditorFor に渡すと、ランタイム エラーが発生します。同じ子コレクションで異なる目的のために異なる子 EditorTemplates を使用できることを望んでいました。簡略化された例を次に示します。
モデル:
public class Customer
{
int id { get; set; }
public string name { get; set; }
public List<Order> Orders { get; set; }
}
public class Order
{
public int id { get; set; }
public DateTime orderdate { get; set; }
public decimal amount { get; set; }
public Customer customer { get; set; }
}
顧客コントローラ Index() メソッド:
public ActionResult Index()
{
Customer customer = new Customer() {id = 1, name = "Acme Corp.", Orders = new List<Order>()};
customer.Orders.Add(new Order() {id = 1, orderdate = DateTime.Now, amount = 100M});
customer.Orders.Add(new Order() { id = 2, orderdate = DateTime.Now, amount = 200M });
return View(customer);
}
顧客 Index.cshtml ビュー:
@model TemplateTest.Customer
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Customer</title>
</head>
<body>
<div>
@Html.EditorFor(Model=>Model.name)
<table>
<thead>
<tr>
<th>Order ID</th>
<th>Order Date</th>
<th>Amount</th>
</tr>
</thead>
@Html.EditorFor(Model=>Model.Orders)
</table>
</div>
</body>
</html>
Views/Shared/EditorTemplates の Order.cshmtl テンプレート(このテンプレートを使用していることを確認するために「色」を追加):
@model TemplateTest.Order
<tr>
<td>@Html.DisplayFor(Model=>Model.id)</td>
<td style="color:blue">@Html.EditorFor(Model=>Model.orderdate)</td>
<td>@Html.EditorFor(Model=>Model.amount)</td>
</tr>
これはうまくいきます。しかし、EditorTemplate の名前を「OrderList.cshtml」に変更し、子の EditorFor 行を次のように変更すると、
@Html.EditorFor(Model=>Model.Orders, "OrderList")
もう一度実行すると、次の例外が発生します。
「ディクショナリに渡されたモデル アイテムのタイプは 'System.Collections.Generic.List`1[TemplateTest.Order]' ですが、このディクショナリにはタイプ 'TemplateTest.Order' のモデル アイテムが必要です。」</p>
「templateName」引数で指定したテンプレート「OrderList」を EditorFor が使用しない理由がわかりませんか?それ以外の場合、その引数は何のためのものですか?