【问题标题】:View Engines for Web Matrix Web PagesWeb Matrix 网页的视图引擎
【发布时间】:2011-02-17 17:01:28
【问题描述】:

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

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

【问题讨论】:

  • 什么是新的网页引擎?不能只用MVC在那里混搭吗?
  • ASP.NET 团队已声明(您已通过 Reflector 确认)asp.net 网页在技术上与 Razor 没有关联,就像 MVC3 一样。但是,我还没有看到有关如何在网页上注册 Spark 之类的东西的示例.. 并且团队的博客表明他们稍后会访问它。所以我鼓励你做到这一点,但很遗憾我不能就如何实现提供建议。
  • 用我目前的思维模式添加了一个答案。如果我能找到一些时间,我稍后会尝试挂钩 Spark。您提出的有趣问题

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


【解决方案1】:

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

在网页中,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% 工作。覆盖所有内容并将我们的 buildprovider 连接到管道(不使用方法)可能更合适。

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我正在尝试添加自己的视图引擎,而不是 .aspx 或其他当前支持的页面类型。
    • 如果你想使用自己的视图引擎,你需要使用支持MVC之类的框架,就像mellamokb说的那样。网页不支持这种可扩展性。
    • 我目前使用 MVC,但偶尔我想要一个更简单的框架,例如 WebMatrix + Web Pages。在网页上使用 Reflector 表明注册正在进行——这是有道理的,因为 Razor 是一个可注册的引擎。网页可能被 Razor 锁定了,我不知道。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多