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

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

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

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

最佳答案

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

在网页中,Razor 的工作原理是向 .cshtml 和 .vbhtml 的 ASP.NET 构建管道注册 BuildProvider。

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

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

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

Razor Hook 其构建提供程序:

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

Hook 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() 方法,理论上您可以 Hook 不同的 BuildProvider 来获取 WebPage 请求而不是 Razor。

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

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

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

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

再次,只是分享我的想法。如果有时间的话,我会尝试注册 Spark 或其他东西。

关于asp.net - Web 矩阵网页的查看引擎,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5032048/

相关文章:

node.js - Webmatrix 2 损坏

webmatrix - _PageStart.cshtml 与 ASP.NET 网页中的 _AppStart.cshtml

javascript - Node.js Express 将 Underscore.js 注册为 View 引擎的示例?

c# - 每次 IsCallback 变得 fasle

c# - 使用异步从数据库返回数据有什么好处?

.net - sqlexpress 本地数据库管理员密码

node.js - 有没有办法通过 Express + Node.js 使用多个 View 引擎

c# - Nustache View 引擎 ArrayTypeMismatchException

c# - 如何在asp.net linkBut​​ton 中添加imagebutton?

c# - 如何使用 ffmpeg 为所有视频文件生成缩略图?