1

DisplayFor使用和指定要使用的显示模板时出现意外错误。

我有一个实现基本模型的模型

public class Smokey : Bacon
{

}

我有一个显示模板;Smokey.cshtml 有一个 Smokey 的模型

现在我传递给的模型DisplayForIEnumerable<Bacon>. 当我没有指定要使用的显示模板时,这可以正常工作。

@Html.DisplayFor(x => x.Items);

但是,如果我指定显示模板,我会得到一个异常,告诉传递的项目是培根类型的 IEnumerable,但是这个字典需要一个“Smokey”类型的模型项目。

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

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

4

2 回答 2

2

解决了

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

这个问题的解决方案是在Darin Dimitrov's answer on stackoverflow

这是解决方法

@for (int i = 0; i < Model.Items.Count(); i++)
{
    @Html.DisplayFor(x => x.Items.ToList()[i], "Smokey")
}
于 2013-05-13T16:56:53.200 回答
1

它不起作用的原因是因为你告诉 Razor 你要给它 Smokey 对象,但你只给它 Bacon 对象。Bacon 对象不是 Smokey 对象,但 Smokey 对象是 Bacon 对象。反过来也行不通。

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

于 2013-05-13T15:53:53.710 回答