asp.net MVC DisplayTemplates и EditorTemplate именования - PullRequest
13 голосов
/ 23 февраля 2010

У меня есть пара вопросов по соглашению об именах для DisplayTemplates и EditorTemplates в MVC 2.

Если, например, у меня есть объект клиента с дочерним списком учетных записей, как мне:

  • Создать шаблон отображения для списка учетных записей, как называется файл?

  • Когда я делаю foreach( var c in Model.Accounts ), как мне вызвать дисплейный храм в цикле foreach? Когда я делаю Html.DisplayFor( x => x ) внутри foreach x это модель, а не в этом случае c.

Заранее спасибо.

Ответы [ 5 ]

13 голосов
/ 24 февраля 2010

Да, это одна из моих любимых функций, но некоторые вещи немного запутывают.

Итак, при создании шаблона для любого класса имя основывается на свойстве типа Name, например, если вы делаете <% = model.GetType (). Name%> в своем представлении, вы можете увидеть, что имею в виду. Например, если ваш список учетных записей представляет собой IList, то вызов .Name для типа вернет List`1. Это допустимое имя файла, поэтому, если вы поместите List`1.ascx в папку DisplayTemplates, он найдет его и будет использовать. насколько я могу судить, он не будет проходить через иерархию классов, поэтому, например, если вы поместите туда файл IEnumerable`1.ascx, он его не найдет.

Чтобы отобразить в цикле, вам нужно передать переменную item в лямбду, поэтому в вашем примере:

<% foreach (var c in Accounts){ %>
      <li><%= Html.DisplayFor(x => c) %></li>
<%}%>

Надеюсь, это поможет. Пол

13 голосов
/ 16 февраля 2011

Я понимаю, что этот вопрос немного устарел, но по крайней мере в MVC 3, когда вы хотите иметь пользовательский шаблон отображения / редактирования с использованием списка, вы можете передать имя шаблона:

Html.DisplayFor(model => model.Account, "AccountList")

тогда имя вашего шаблона будет "AccountList".

11 голосов
/ 24 февраля 2010

Блог Брэда Уилсона здесь http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-4-custom-object-templates.html содержит пример о DisplayTemplates и EditorTemplates для пользовательских объектов и обсуждает проблемы, которые могут быть полезны при решении вашего вопроса.

Что касается вашего первого вопроса, это важно , что ваш шаблон находится в папке, в которой система ищет совпадающие имена, например,

 ~/Views/ControllerName/DisplayTemplates/TemplateName.aspx & .ascx
 ~/Views/Shared/DisplayTemplates/TemplateName.aspx & .ascx 

(Замените DisplayTemplates на EditorTemplates для путей поиска для шаблонов редактора.)

Следующие имена шаблонов используются в следующем порядке:

  • TemplateHint из ModelMetadata
  • DataTypeName из ModelMetadata
  • Имя типа (см. Примечания ниже)
  • Если объект не сложный: «Строка»
  • Если объект сложный и интерфейс: «Объект»
  • Если объект сложный, а не интерфейс: Recurseчерез наследование hiearchy для типа, пробуя каждое имя типа

Я не уверен насчет ответа на ваш второй вопросп.Правильно ли предположить, что var c фактически является учетной записью c?И когда вы пишете Html.DisplayFor(x => x), вы можете написать Html.DisplayModelFor(c => c)?Или вы хотите, например, `Html.DisplayFor (x => x.AccountName)?

1 голос
/ 02 августа 2011

При настройке приложения MVC 3 внешние ключи, которые позволяют раскрывающимся спискам выбирать элемент, отображаются не как раскрывающиеся списки, а как статические входные данные. Эту проблему можно решить, создав настраиваемое отображение и представление для этого поля. Нам нужно начать с создания пользовательского частичного представления, которое будет находиться в «~ / Views / Shared / DisplayTemplates / UserGuid.cshtml» и «~ / Views / Shared / EditTemplates / UserGuid.cshtml». Код для одного находится ниже:

@model Guid

@{ 
    incMvcSite.Models.MvcSiteDB db = new incMvcSite.Models.MvcSiteDB();
    incMvcSite.Models.SecUser usr = db.SecUsers.Single(u => u.Guid == Model);
}
@usr.Display

Это отображение для шаблона, который будет искать элемент в ссылочной таблице и отображать его. Нам также нужно отредактировать шаблон следующим образом:

@model Guid
@{ 
    incMvcSite.Models.MvcSiteDB db = new incMvcSite.Models.MvcSiteDB();
    SelectList items = new SelectList(db.SecUsers.OrderBy(i => i.Display).ToList(), "Guid", "Display", Model);
}
@Html.DropDownList("", items)

Редактирование шаблона реализовано в виде выпадающего списка. Первоначально мы использовали статический HTML-код, но возникнет проблема с реализацией «префикса». Статический HTML-код обрабатывается HTML-помощниками, поэтому рекомендуется использовать HTML.DropDownList (). Чтобы заставить MVC-фреймворк использовать новые Display и Edit для шаблонов, нам нужно аннотировать наш элемент модели и добавить следующую строку: [UIHint ( "UserGuid")]

Это заставит MVC использовать шаблоны Display и Edit с именем «UserGuid», которые являются только частичными представлениями.

0 голосов
/ 07 июля 2014

Не уверен в предыдущих версиях, но в MVC5 вы можете использовать UIHint, чтобы указать, какой пользовательский шаблон отображения / редактора использовать в модели, вот так:

[UIHint ( "CustomAccountList")] Публичные списки аккаунтов {get; задавать; }

ИЛИ в виде, как это

Html.DisplayFor (model => model.Accounts, "CustomAccountList")

...