使用DisplayFor
并指定要使用的显示模板时,我收到意外错误。
我有一个实现基本模型的模型
public class Smokey : Bacon
{
}
我有一个显示模板; Smokey.cshtml有一个Smokey模型
现在我传递给DisplayFor
的模型是IEnumerable<Bacon>
。当我没有指定要使用的显示模板时,这可以正常工作。
@Html.DisplayFor(x => x.Items);
但是,如果我指定显示模板,我会得到一个异常,告诉传递的项目是类型为Bacon的IEnumerable,但是这个字典需要一个类型为“Smokey”的模型项。
@Html.DisplayFor(x => x.Items, "Smokey");
我试图理解为什么这种方式有效而不是另一种方式?有什么区别?
答案 0 :(得分:2)
问题证明是模板助手的限制。如果指定模板名称,则不再将其应用于集合中的每个项目。
在stackoverflow上的Darin Dimitrov's answer中找到了此问题的解决方案
这是解决方法
@for (int i = 0; i < Model.Items.Count(); i++)
{
@Html.DisplayFor(x => x.Items.ToList()[i], "Smokey")
}
答案 1 :(得分:1)
它不起作用的原因是因为你告诉Razor你要给它Smokey对象,而你只给它培根对象。培根对象不是Smokey对象,但Smokey对象是培根对象。它反过来不起作用。
当您不包含模板时它工作的原因是MVC有一个默认对象模板,它使用反射来遍历对象并在每个公共属性上执行DisplayFor()。如果找不到合适的模板,则使用此默认模板。