У меня есть собственный механизм просмотра, разработанный внутри компании. В том же проекте я хотел бы использовать Razor для некоторых страниц и свой собственный движок для некоторых страниц. Как инфраструктура MVC выбирает, какой движок использовать? Кстати, мой собственный движок не требует никаких шаблонов, он отображает страницы на основе метаданных из базы данных. Для моего пользовательского движка я не хочу настраивать файлы шаблонов. Я ожидаю, что должен быть способ заставить фреймворк использовать определенный движок на основе имени контроллера и имени действия. Существует ли эта гибкость в MVC3?
Как MVC3 выбирает, какой ViewEngine использовать, если у меня есть несколько движков в коллекции ViewEngines?
Ответы (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.
Я думаю, что самым простым способом было бы реализовать 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.