2011-02-03 83 views
2

有沒有一種方便的方式來從字符串返回視圖,而不必從磁盤上的文件來?ASP.NET MVC3 Razor - 從字符串創建視圖?

我已經實現了一個自定義VirtualPathProvider來處理從數據庫中檢索視圖,但我並不總是希望視圖被存儲在數據庫中。

更新2011年2月15日

我碰到一個very nice open source component,它簡化了在code.I've編譯剃刀意見換下大部分的虛擬路徑提供的代碼與此組件的過程中偶然發現,它的工作令人難以置信的好。我向任何試圖從數據庫或其他地方編譯視圖的人推薦它,這些人不需要虛擬路徑提供者的附加功能。該組件允許您直接在您的控制器/應用程序/任何內容(不需要Web上下文和控制器上下文)中編譯視圖,而無需跳過VPP環。

回答

1

您可以通過創建RazorTemplateEngine來自己運行視圖,該視圖可以讀取源代碼並編譯爲WebViewPage

然後,您可以通過編寫

webViewPage.OverridenLayoutPath = LayoutPath; 
webViewPage.VirtualPath = ViewPath; 
webViewPage.ViewContext = viewContext; 
webViewPage.ViewData = viewContext.ViewData; 

webViewPage.InitHelpers(); 
WebPageRenderingBase startPage = null; 
if (RunViewStartPages) { 
    startPage = StartPageLookup(webViewPage, RazorViewEngine.ViewStartFileName, ViewStartFileExtensions); 
} 
webViewPage.ExecutePageHierarchy(new WebPageContext(context: viewContext.HttpContext, page: null, model: null), writer, startPage); 

support the new @model keyword運行WebViewPage,你需要重寫你的RazorEngineHost使用MVC的自定義生成方法:

public override RazorCodeGenerator DecorateCodeGenerator(RazorCodeGenerator incomingCodeGenerator) { 
    if (incomingCodeGenerator is CSharpRazorCodeGenerator) { 
     return new MvcCSharpRazorCodeGenerator(incomingCodeGenerator.ClassName, 
               incomingCodeGenerator.RootNamespaceName, 
               incomingCodeGenerator.SourceFileName, 
               incomingCodeGenerator.Host); 
    } 
    else if (incomingCodeGenerator is VBRazorCodeGenerator) { 
     return new MvcVBRazorCodeGenerator(incomingCodeGenerator.ClassName, 
              incomingCodeGenerator.RootNamespaceName, 
              incomingCodeGenerator.SourceFileName, 
              incomingCodeGenerator.Host); 
    } 
    return base.DecorateCodeGenerator(incomingCodeGenerator); 
} 

public override ParserBase DecorateCodeParser(ParserBase incomingCodeParser) { 
    if (incomingCodeParser is CSharpCodeParser) { 
     return new MvcCSharpRazorCodeParser(); 
    } 
    else if (incomingCodeParser is VBCodeParser) { 
     return new MvcVBRazorCodeParser(); 
    } 
    else { 
     return base.DecorateCodeParser(incomingCodeParser); 
    } 
}