Просмотр двигателей для веб-страниц веб-матрицы
У Microsoft появился новый инструмент для редактирования сайтов: WebMatrix. WebMatrix использует новый механизм веб-страниц, в котором Razor является механизмом просмотра; Razor - это также новый движок для MVC3. Я пытаюсь выяснить, можно ли зарегистрироваться и использовать другой механизм просмотра на веб-страницах (как вы можете в MVC).
Кто-нибудь знает, возможно ли добавить или заменить механизм просмотра на веб-страницах? Если так, кто-нибудь документировал это? Примеры?
2 ответа
Я надеюсь попробовать это сам чуть позже, но сейчас я просто поделюсь своими текущими мыслями:
В 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, к которому вместо Razor будет получен запрос WebPage.
В некоторых блогах упоминается метод RegisterExtension, но есть также отчет об ошибках открытого подключения, показывающий, что он не работает на 100%. Может быть более уместно просто переопределить все и подключить наш buildprovider к каналу (не используя метод).
Web.config предоставляет конструкцию для регистрации buildProviders, поэтому я попробую это сделать.
<buildProviders>
<add extension=".cshtml" type="CustomStuff.CustomBuildProvider"/>
</buildProviders>
Проблема заключается в том, что большинство движков представления используют ViewEngines.Register(), концепцию, которой веб-страницы, похоже, не имеют. Таким образом, мы должны были бы обернуть эти механизмы представления в BuildProvider и / или создать BuildProvider, который может успешно вызывать IViewEngine
Опять же, просто делюсь своими мыслями. Я постараюсь зарегистрировать Spark или что-нибудь позже, если найду время.
Вы не можете "зарегистрировать" механизмы просмотра на веб-страницах так же, как MVC. Вы просто смешиваете и сопоставляете типы файлов. Ничто не мешает вам добавлять файлы.aspx на ваш сайт. Веб-страницы гораздо больше похожи на проект веб-сайта в VS.