查看Web矩阵网页的引擎

时间:2011-02-17 17:01:29

标签: asp.net webmatrix viewengine asp.net-webpages

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

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

2 个答案:

答案 0 :(得分:2)

我希望稍后自己尝试一下,但是现在我只想分享我目前的想法

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

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

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

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

Razor挂钩其构建提供商:

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或其他东西。

答案 1 :(得分:0)

您不能以与MVC相同的方式在Web页面中“注册”视图引擎。您只需混合和匹配文件类型。没有什么可以阻止你将.aspx文件添加到你的网页站点。网页更类似于VS中的网站项目。