微软有一个新的网站编辑工具: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或其他东西.