Asp.net mvc 4 使用@Html.DisplayFor指定显示模板时的不同行为

Asp.net mvc 4 使用@Html.DisplayFor指定显示模板时的不同行为,asp.net-mvc-4,Asp.net Mvc 4,使用DisplayFor并指定要使用的显示模板时,我遇到了一个意外错误 @Html.DisplayFor(x => x.Items); 我有一个实现基本模型的模型 public class Smokey : Bacon { } 我有一个显示模板;Smokey.cshtml,它具有Smokey的模型 现在,我传递给DisplayFor的模型是IEnumerable。当我没有指定要使用的显示模板时,这可以正常工作 @Html.DisplayFor(x => x.Items); 但

使用
DisplayFor
并指定要使用的显示模板时,我遇到了一个意外错误

@Html.DisplayFor(x => x.Items);
我有一个实现基本模型的模型

public class Smokey : Bacon
{

}
我有一个显示模板;Smokey.cshtml,它具有Smokey的模型

现在,我传递给
DisplayFor
的模型是
IEnumerable
。当我没有指定要使用的显示模板时,这可以正常工作

@Html.DisplayFor(x => x.Items);
但是如果我指定了显示模板,我会得到一个异常,告诉我传递的项是培根类型的IEnumerable,但是这个字典需要一个“Smokey”类型的模型项

@Html.DisplayFor(x => x.Items, "Smokey");

我试图理解为什么这是一种方式而不是另一种方式?区别是什么?

它不起作用的原因是因为你告诉Razor你要给它烟熏的东西,但你只给它培根的东西。培根对象不是Smokey对象,但Smokey对象是培根对象。反过来也不行

当不包含模板时,它工作的原因是MVC有一个默认的对象模板,该模板使用反射遍历对象,并对每个公共属性执行DisplayFor()。如果找不到合适的模板,则使用此默认模板。

问题是模板化助手的局限性。如果指定模板名称,它将不再将其应用于集合中的每个项目

此问题的解决方案在on stackoverflow中找到

这是解决办法

@for (int i = 0; i < Model.Items.Count(); i++)
{
    @Html.DisplayFor(x => x.Items.ToList()[i], "Smokey")
}
@for(int i=0;ix.Items.ToList()[i],“Smokey”)
}

感谢您的回复。这个问题原来是模板帮助程序中的一个限制。如果指定模板,它将不再将其应用于集合中的每个项目。