Asp.net MVC DisplayTemplates и EditorTemplate соглашение об именах
У меня есть несколько вопросов относительно соглашения об именах для DisplayTemplates и EditorTemplates в MVC 2.
Если, например, у меня есть объект-клиент с дочерним списком учетных записей, как я:
-
Создайте шаблон отображения для списка учетных записей, что называется файлом?
-
Когда я делаю foreach( var c in Model.Accounts )
, как я могу назвать храм отображения в цикле foreach? Когда я делаю Html.DisplayFor( x => x )
внутри foreach x
является моделью, а не в этом случае c
.
Спасибо заранее.
Ответы
Ответ 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 из ModelMetadatali >
- DataTypeName из ModelMetadatali >
- Название типа (см. примечания ниже)
- Если объект не является сложным: "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" )