Подтвердить что ты не робот

Asp.net MVC DisplayTemplates и EditorTemplate соглашение об именах

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

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

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

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

Спасибо заранее.

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

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

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

Ответ 3

Брэд Уилсонс блог здесь 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 для путей поиска для шаблонов редактора.)

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

  • ШаблонHint из ModelMetadata​​li >
  • DataTypeName из ModelMetadata​​li >
  • Название типа (см. примечания ниже)
  • Если объект не является сложным: "String"
  • Если объект сложный и интерфейс: "Объект"
  • Если объект является сложным, а не интерфейсом: рекурсия через наследование hiearchy для типа, пробовать каждое имя типа

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

Ответ 4

При настройке приложения 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 использовать новые шаблоны отображения и редактирования для шаблонов, нам необходимо аннулировать наш элемент модели, добавив следующую строку: [UIHint ( "UserGuid" )]

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

Ответ 5

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

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

ИЛИ в таком виде

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