2011-02-17 76 views
4

微軟有一個新的網站編輯工具:WebMatrix。 WebMatrix使用新的Web頁面引擎,其中Razor是視圖引擎; Razor也是MVC3的新視圖引擎。我試圖找出是否有可能在Web頁面中註冊和使用不同的視圖引擎(就像你可以在MVC中一樣)。查看引擎的Web矩陣網頁

有誰知道是否有可能添加或替換網頁中的視圖引擎?如果有的話有人記錄了這一點?例子?

+0

什麼是新的網頁引擎?你不能只使用MVC並在那裏混搭? – mellamokb

+0

ASP.NET團隊已經聲明(並且已經用Reflector確認),asp.net網頁在技術上並不與Razor綁定,就像MVC3不是。然而,我還沒有看到有關如何在網頁上註冊類似Spark的示例..並且該團隊的博客表示他們將在稍後訪問該示例。所以我鼓勵你可以做到,但不幸的是,我不能提供如何實現的建議。 –

+0

添加了我目前的思維模式的答案。如果我能找到一些時間的話,我會試着勾住Spark。你提出的有趣問題 –

回答

2

我希望以後嘗試這個自己一點,但現在我只想分享我的想法電流

網頁中,剃鬚刀的工作原理是用ASP.NET構建管註冊BuildProvider .cshtml和.vbhtml。

WebPages反過來將.cshtml .vbhtml擴展註冊到其處理程序。

當請求webPages頁面時,System.Web.WebPages.WebPageHttpHandler將路徑傳遞給構建管道,其中擴展與註冊的Razor提供程序相匹配,該提供程序呈現頁面並返回WebPage對象,該處理程序傳遞給IIS並被提供。

如果您使用反射工具,您將看到所有這些。這兩個都是在相應程序集的PreApplicationStartCode.Start()中實現的。

剃刀鉤住其生成提供:

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(),該網頁不會出現一個概念有。所以我們必須將這些視圖引擎包裝在BuildProvider中,或者創建一個BuildProvider,它可以成功調用IViewEngine

再次,只是分享我的想法。如果我找到時間,我會嘗試註冊Spark或其他東西。

0

您不能像MVC那樣在Web頁面中「註冊」視圖引擎。你只需要混合和匹配文件類型。沒有什麼可阻止您將.aspx文件添加到您的網頁網站。網頁更像VS中的網站項目。

+0

我想添加我自己的視圖引擎,而不是.aspx或其他當前支持的頁面類型。 –

+0

如果你想使用你自己的視圖引擎,你需要使用一個支持MVC的框架,就像mellamokb所說的那樣。網頁不支持這種可擴展性。 –

+0

我目前使用MVC,但偶爾我想要一個更簡單的框架,如WebMatrix +網頁。在網頁上使用Reflector表明註冊正在進行 - 這很有意義,因爲Razor是一個可註冊的引擎。網頁可能被鎖定到Razor,我不知道。 –