微软有一个新的网站编辑工具:WebMatrix。WebMatrix 使用新的网页引擎,其中 Razor 是视图引擎;Razor 也是 MVC3 的新视图引擎。我试图找出是否可以在网页中注册和使用不同的视图引擎(就像在 MVC 中一样)。
有谁知道是否可以在网页中添加或替换视图引擎?如果是这样,是否有人记录了这一点?例子?
微软有一个新的网站编辑工具:WebMatrix。WebMatrix 使用新的网页引擎,其中 Razor 是视图引擎;Razor 也是 MVC3 的新视图引擎。我试图找出是否可以在网页中注册和使用不同的视图引擎(就像在 MVC 中一样)。
有谁知道是否可以在网页中添加或替换视图引擎?如果是这样,是否有人记录了这一点?例子?
我希望稍后自己尝试一下,但现在我将分享我目前的想法:
在 WebPages 中,Razor 通过使用 ASP.NET 构建管道为 .cshtml 和 .vbhtml 注册一个 BuildProvider 来工作。
反过来,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();
}
}
要覆盖我们需要使用 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 或其他东西。
您不能以与 MVC 相同的方式在网页中“注册”视图引擎。您只需混合和匹配文件类型。没有什么可以阻止您将 .aspx 文件添加到您的网页站点。网页更类似于 VS 中的网站项目。