2013-10-24 5 views
3

У меня есть список элементов, которые я передаю в представление. Я хотел бы отображать каждый элемент с помощью шаблона отображения. Однако, что-то не так, потому что я не получаю правильно обработанное поле. Вот мой главный вид (Index.cshtml):MVC Razor display template

@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

Не будет ли поиск DisplayTemplate с использованием 'IEnumerable ' как модели вместо 'CustomEntity'? –

+0

Спасибо Дарин! Мне не было имени для моего шаблона отображения. Он назывался Entity вместо 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