Просмотр двигателей для веб-страниц веб-матрицы - PullRequest
4 голосов
/ 17 февраля 2011

У Microsoft появился новый инструмент для редактирования веб-сайтов: WebMatrix. WebMatrix использует новый механизм веб-страниц, в котором Razor является механизмом просмотра; Razor - это также новый движок для MVC3. Я пытаюсь выяснить, можно ли зарегистрироваться и использовать другой механизм просмотра на веб-страницах (как вы можете в MVC).

Кто-нибудь знает, возможно ли добавить или заменить механизм просмотра на веб-страницах? Если так, кто-нибудь задокументировал это? Примеры?

Ответы [ 2 ]

2 голосов
/ 21 февраля 2011

Я надеюсь попробовать это сам чуть позже, но сейчас я просто поделюсь своими текущими мыслями :

В 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 или еще что-нибудь, если найду время.

0 голосов
/ 17 февраля 2011

Вы не можете «зарегистрировать» механизмы просмотра на веб-страницах так же, как MVC. Вы просто смешиваете и сопоставляете типы файлов. Ничто не мешает вам добавлять файлы .aspx на ваш сайт. Веб-страницы гораздо больше похожи на проект веб-сайта в VS.

...