Я надеюсь попробовать это сам чуть позже, но сейчас я просто поделюсь своими текущими мыслями :
В WebPages Razor работает, регистрируя BuildProvider с конвейером сборки ASP.NET для .cshtml и .vbhtml.
WebPages, в свою очередь, регистрирует расширения .cshtml .vbhtml в своем обработчике.
Когда запрашивается страница webPages, System.Web.WebPages.WebPageHttpHandler передает путь к каналу сборки, где расширения сопоставляются с зарегистрированным поставщиком Razor, который отображает страницу и возвращает объект WebPage, который обрабатывается обработчиком. в IIS и обслуживается.
Вы увидите все это, если будете использовать инструмент отражения. Оба они достигаются в PreApplicationStartCode.Start () соответствующей сборки.
Razor перехватывает свой провайдер сборки:
public static void Start()
{
if (!_startWasCalled)
{
_startWasCalled = true;
BuildProvider.RegisterBuildProvider(".cshtml", typeof(RazorBuildProvider));
BuildProvider.RegisterBuildProvider(".vbhtml", typeof(RazorBuildProvider));
}
}
Веб-страницы, перехватывающие WebPageHandler
public static void Start()
{
if (!_startWasCalled)
{
_startWasCalled = true;
WebPageHttpHandler.RegisterExtension("cshtml");
WebPageHttpHandler.RegisterExtension("vbhtml");
PageParser.EnableLongStringsAsResources = false;
DynamicModuleUtility.RegisterModule(typeof(WebPageHttpModule));
ScopeStorage.CurrentProvider = new AspNetRequestScopeStorageProvider();
}
}
Чтобы переопределить, нам нужно создать и зарегистрировать отдельный BuildProvider с каналом ASP.NET для рендеринга наших страниц. System.Web.WebPages предоставляет метод WebPageHttpHandler.RegisterExtension (), который теоретически можно подключить к другому BuildProvider, к которому будет получен запрос WebPage вместо Razor.
В некоторых блогах упоминается метод RegisterExtension, но есть также отчет об ошибках открытого подключения, показывающий, что он не работает на 100%. Может быть более уместно просто переопределить все и подключить наш buildprovider к каналу (не используя метод).
Web.config предоставляет конструкцию для регистрации buildProviders, поэтому я попробую это сделать.
<buildProviders>
<add extension=".cshtml" type="CustomStuff.CustomBuildProvider"/>
</buildProviders>
Проблема заключается в том, что большинство движков представления используют ViewEngines.Register (), концепцию, которой веб-страницы, похоже, не имеют. Таким образом, мы должны были бы обернуть эти механизмы представления в BuildProvider и / или создать BuildProvider, который может успешно вызывать IViewEngine
Опять же, просто делюсь своими мыслями. Я постараюсь зарегистрировать Spark или еще что-нибудь, если найду время.