Как MVC3 выбирает, какой ViewEngine использовать, если у меня есть несколько движков в коллекции ViewEngines?

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


person Charasala    schedule 27.11.2011    source источник


Ответы (2)


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

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

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

person Marco Miltenburg    schedule 27.11.2011
comment
Спасибо, Марко. Если вы не хотите, чтобы ваш механизм просмотра использовался в определенной ситуации, вы возвращаете new ViewEngineResult(new string[0]); из FindView или FindPartialView, и MVC выберет другой механизм просмотра. Это действительно сработало хорошо. Но это ненужное путешествие к моему пользовательскому движку, когда я точно знаю, какой движок тоже использую в некоторых случаях. Вероятно, разработчики MVC не подумали об этой ситуации. Еще раз спасибо! - person Charasala; 27.11.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.

person Tomas Jansson    schedule 27.11.2011
comment
да. Я использую внедрение зависимостей с Unity. Не могли бы вы объяснить, как это можно решить, внедрив IViewPageActivator. Если добавить какую-либо пользовательскую реализацию в IViewPageActivator, то снова существует та же проблема, о которой я писал. Могу ли я иметь более одного IViewPageActivator? Как настроить то или иное? - person Charasala; 27.11.2011
comment
Я не знаю, можете ли вы иметь более одного IViewPageActivator, но не должно быть сложно реализовать свой собственный, который решает эту проблему. Кроме того, я думаю, что возврат null приведет к срабатыванию значения по умолчанию. - person Tomas Jansson; 27.11.2011