Пользовательские шаблоны MVC 3 и путаница EditorForModel - PullRequest
8 голосов
/ 02 июня 2011

Итак, насколько я понимаю,

Учитывая модель представления

public class MyViewModel{
    public DateTime Date {get; set;}
    public MyClass Class {get; set;}
}

.. a Представления представления \ MyController \ MyAction.cshtml

@model MyViewModel
@Html.DisplayForModel()

.. aчастичное представление View \ Shared \ DisplayTemplates \ DateTime.chstml

@model DateTime
Some Date

.. другое частичное представление View \ Shared \ DisplayTemplates \ MyClass.cshtml

@model MyClass
My Class

.. Я должен получить

Date
Some Date
Class
My Class    

.. Но я просто получаю

Date
Some Date

Так что, похоже, DisplayForModel находит шаблон DateTime, но не мой пользовательский шаблон, хотя я соблюдаю соглашения о присвоении ему имени по типусвойство.

Я что-то упустил.Я использую MVC 3 и считаю, что эта функция уже была доступна в MVC 2

1 Ответ

5 голосов
/ 01 июля 2011

Изучив исходный код MVC, выясняется, что это на самом деле невозможно.

Причина в том, что @Html.DisplayForModel() пытается найти шаблон для использования при рендеринге:

  • сначала ищет название типа модели, например MyViewModel.cshtml или MyViewModel.vbhtml или MyViewModel.ascx и т. Д., В расположении ~\Views, ~\Views[ControllerName], ~\Views\DisplayTemplates, ~\Views\Shared, ~\Views\Shared\DisplayTemplates
  • если он не найден, он будет проходить по базовым типам модели, пытаясь по очереди назвать каждый тип
  • если ничего не найдено, он в конечном итоге окажется на Object, для которого существует встроенный шаблон

Шаблон объекта разработан таким образом, что он извлекает все свойства модели для рендеринга из метаданных на основе следующего условия:

metadata.ShowForDisplay
&& metadata.ModelType != typeof(EntityState)
&& !metadata.IsComplexType 
&& !templateInfo.Visited(metadata)

Поэтому любое свойство, которое является сложным типом, всегда будет исключено. Я думаю, что путаница возникает из сообщения Брэда Уилсона о шаблоне пользовательского объекта , где он создает шаблон пользовательского объекта и решает проблему Shallow Dive vs Deep Dive. Благодаря реализации пользовательского шаблона объекта глубокого погружения это заменит встроенный шаблон объекта, и сложные типы могут быть обработаны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...