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

时间:2013-05-13 14:53:10

标签: asp.net-mvc-4

使用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");

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

2 个答案:

答案 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()。如果找不到合适的模板,则使用此默认模板。