Как MVC3 выбирает, какой ViewEngine использовать, если в коллекции ViewEngines есть несколько движков? - PullRequest
6 голосов
/ 27 ноября 2011

У меня есть собственный механизм просмотра, разработанный внутри. В том же проекте я хотел бы использовать Razor для некоторых страниц и свой собственный движок для некоторых страниц. Как MVC Framework выбирает какой движок использовать? Кстати, мой пользовательский движок не требует никаких шаблонов, он отображает страницы на основе метаданных из базы данных. Для моего собственного движка я не хочу устанавливать файлы шаблонов. Я ожидаю, что должен быть способ заставить фреймворк использовать определенный движок на основе имени контроллера и имени действия. Существует ли такая гибкость в MVC3?

Ответы [ 2 ]

6 голосов
/ 27 ноября 2011

Ваш движок просмотра должен реализовывать интерфейс IViewEngine .После того, как вы зарегистрировали свой механизм просмотра с помощью метода ViewEngines.Engines.Add(), инфраструктура MVC будет вызывать FindView и FindPartialView всякий раз, когда ему требуется механизм представления для визуализации представления.

Для двигателей с несколькими представлениями абсолютно возможно работать бок о бок.Если вы не хотите, чтобы ваш механизм просмотра использовался в конкретной ситуации, вы return new ViewEngineResult(new string[0]); из FindView или FindPartialView и MVC выберете другой механизм просмотра.Если вы хотите, чтобы ваш механизм просмотра использовался, вы возвращаете действительный ViewEngineResult , указывающий на класс представления (который реализует IView ), который вы хотите Render результат.

Есть некоторые особенности с параметром useCache.Если вы хотите узнать больше, Луи ДеДжарден на TechEd 2011 представил отличную презентацию по созданию собственного движка представления.Вы можете найти видео Написание ASP.NET MVC View Engine на канале 9.

0 голосов
/ 27 ноября 2011

Я думаю, что проще всего было бы реализовать IViewPageActivator, http://bradwilson.typepad.com/blog/2010/10/service-location-pt11-view-page-activator.html и http://msdn.microsoft.com/en-us/library/system.web.mvc.iviewpageactivator(v=vs.98).aspx.

Я думаю, что возврат null из метода Create сделает его по умолчанию по умолчанию IViewPageActivator. Вы вводите его в DependencyResolver, http://bradwilson.typepad.com/blog/2010/10/service-location-pt5-idependencyresolver.html.

Это может быть проще в использовании, если вы используете инфраструктуру внедрения зависимостей как NInject или Unity.

...