asp.net – 查看Web矩阵网页的引擎

微软有一个新的网站编辑工具:WebMatrix. WebMatrix使用新的Web页面引擎,其中Razor是视图引擎; Razor也是MVC3的新视图引擎.我试图找出是否可以在Web页面中注册和使用不同的视图引擎(就像你在MVC中一样).

有谁知道是否可以在网页中添加或替换视图引擎?如果是这样,有人记录了这个吗例子?

最佳答案 我希望稍后自己尝试一下,但是现在我将分享我目前的想法:

在WebPages中,Razor通过使用.cshtml和.vbhtml的ASP.NET构建管道注册BuildProvider来工作.

反过来,WebPages将.cshtml .vbhtml扩展名注册到其处理程序.

当请求webPages页面时,System.Web.WebPages.WebPageHttpHandler将路径传递给构建管道,其中扩展名与注册的Razor Provider匹配,后者呈现页面并传回WebPage对象,该处理程序传递给IIS和送达.

如果你使用反射工具,你会看到所有这些.这两个都是在相应程序集的PreApplicationStartCode.Start()中实现的.

剃刀挂钩其构建提供商:

public static void Start()
{
    if (!_startWasCalled)
    {
        _startWasCalled = true;
        BuildProvider.RegisterBuildProvider(".cshtml", typeof(RazorBuildProvider));
        BuildProvider.RegisterBuildProvider(".vbhtml", typeof(RazorBuildProvider));
    }
}

WebPages挂钩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();
    }
}

要覆盖我们需要使用ASP.NET管道创建和注册单独的BuildProvider来呈现我们的页面. System.Web.WebPages提供了一个WebPageHttpHandler.RegisterExtension()方法,理论上你可以挂钩一个不同的BuildProvider来获取WebPage请求而不是Razor.

一些博客提到了RegisterExtension方法,但也有一个开放的连接错误报告显示它不能100%工作.覆盖所有内容并将我们的构建提供者挂钩到管道(不使用该方法)可能更合适.

Web.config提供了一个注册buildProviders的构造,所以我会尝试这样做.

<buildProviders>
   <add extension=".cshtml" type="CustomStuff.CustomBuildProvider"/>
</buildProviders>

挑战在于大多数视图引擎都使用ViewEngines.Register(),这是webPages似乎没有的概念.所以我们必须将这些视图引擎包装在BuildProvider中和/或创建一个可以成功调用IViewEngine的BuildProvider

再一次,只是分享我的想法.如果我找到一些时间,我会尝试注册Spark或其他东西.

点赞