2013-10-24 176 views
3

我有一个项目列表,我传递给一个视图。我想要使​​用显示模板呈现每个项目。然而,有些事情是错误的,因为我没有正确渲染该领域。 这里是我的主视图(Index.cshtml):MVC剃刀显示模板

@model IEnumerable<CustomEntity> 

@{ 
    ViewBag.Title = "Index"; 
} 
@Html.DisplayFor(m=>m) 

这里是我的显示模板:

@model CustomEntity 
<div> 
    @Html.LabelFor(m=>m.Name): 
    <strong>@Model.Name</strong> 
    @Html.LabelFor(m=>m.Icon): 
    <strong>@Model.Icon</strong> 
    @Html.LabelFor(m=>m.TypeName): 
    <strong>@Model.TypeName</strong> 
</div> 

该页面加载,但不显示实体的值。

回答

6
@model IEnumerable<CustomEntity> 

@{ 
    ViewBag.Title = "Index"; 
} 
@Html.DisplayForModel() 

,然后确保您的显示模板存储在~/Views/Shared/DisplayTemplates/CustomEntity.cshtml。请注意,显示模板的位置和名称非常重要。它应该与类型(CustomEntity.cshtml)的调用方式相同,并且应位于~/Views/Shared/DisplayTemplates之内,或者您也可以在~/Views/XXX/DisplayTemplates中覆盖它,其中XXX是呈现主视图的控制器。

+0

是不是会搜索一个以'IEnumerable '为模型而不是'CustomEntity'的DisplayTemplate? –

+0

谢谢达林!我错过了我的显示模板的正确名称。它被称为实体而不是CustomEntity。一旦我改变了名字,它就起作用了。你能告诉我@ Html.DisplayForModel()和@ Html.DisplayFor(m => m)之间的区别吗? – laconicdev

+0

@RédaMattar,不,当你将一个'IEnumerable '作为一个属性传递给一个显示或编辑器模板时,它会查找一个名为'TModel.cshtml'的模板,它会自动为这个集合的每个元素调用它,不需要在代码中编写任何'foreach'循环。这一切都按照惯例运作。 –

0

您通过Html.DisplayFor类型的数据IEnumerable<CustomEntity>,但您的DisplayTemplate需要CustomEntity。试试这个:

@model IEnumerable<CustomEntity> 

@{ 
    ViewBag.Title = "Index"; 
} 

@foreach(var customEntity in Model) 
{ 
    @Html.DisplayFor(m => customEntity); 
} 
+0

不需要foreach循环。只要一切正确,MVC就会按照惯例处理它。 – Carl