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”)
}
感谢您的回复。这个问题原来是模板帮助程序中的一个限制。如果指定模板,它将不再将其应用于集合中的每个项目。