微软有一个新的网站编辑工具:WebMatrix。 WebMatrix使用新的Web页面引擎,其中Razor是视图引擎; Razor也是MVC3的新视图引擎。我试图找出是否可以在网页中注册和使用不同的视图引擎(就像你在MVC中一样)。
有谁知道是否可以在网页中添加或替换视图引擎?如果是这样,有人记录了这个吗实例
答案 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中的网站项目。