我正在尝试使用 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);
}
客户索引.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>
知道为什么 EditorFor 不使用我在“templateName”参数中指定的模板“OrderList”吗?否则,那个参数是干什么用的?