Razor 的 ServiceStack InMemoryVirtualPathProvider - GetViewPage null

ServiceStack InMemoryVirtualPathProvider for Razor - GetViewPage null

我使用开箱即用的默认实现对此进行了测试,GetViewPage 可以毫无问题地从文件系统中检索视图。

我将 RazorFormat 的 VirtualFileSource 换成了内存中的:

 Plugins.Add(new RazorFormat() {
            VirtualFileSources = new InMemoryVirtualPathProvider(this),
  });

在服务中我正在编写一个视图,如果它不存在的话:

 var helloView = razor.GetViewPage(email.BlastId.ToString());
 if (helloView==null)
 {
   ((InMemoryVirtualPathProvider)razor.VirtualFileSources)
   .WriteFile("~/views/"+email.BlastId + ".cshtml", email.Blast);
   // .WriteFile(email.BlastId + ".cshtml", email.Blast);  doesn't work
 }
 helloView = razor.GetViewPage(email.BlastId.ToString());
 //helloView is always null

我已经确认 RazorFormat 的 VirtualFileSource 有文件,只是 GetViewPage 没有检索到它。

位于 VirtualFileSource 中的文件的屏幕截图:https://db.tt/8oirKd9Msi

此外 returns 正确:razor.VirtualFileSources.FileExists("~/views/"+email.BlastId + ".cshtml") 我在没有视图的情况下尝试过 folder/etc。好像没什么影响。

RazorFormat 在启动时加载已编译的视图,因此在注册 RazorFormat 之前,视图需要存在于 VirtualFileSources 中,以便它在 [=18= 中可用].

要在 RazorFormat 加载后添加文件,您需要在文件写入虚拟文件系统后调用 AddPage(),例如:

razorFormat.VirtualFileSources.WriteFile(filePath, contents);
var razorView = razorFormat.AddPage(filePath);

如果您只想创建一个临时的 Razor 视图,您可以调用 CreatePage() 来创建视图:

var razorView = razorFormat.CreatePage(razorHtml);

并渲染它:

razorFormat.RenderToHtml(razorView, model);

或者如果 Razor 页面和模型都是临时的,可以将其压缩在 1-liner 中:

var html = razorFormat.CreateAndRenderToHtml(razorHtml, model);

工作示例

const string template = "This is my sample view, Hello @Model.Name!";

RazorFormat.VirtualFileSources.WriteFile("/Views/simple.cshtml", template);
var addedView = RazorFormat.AddPage("/Views/simple.cshtml");
var viewPage = RazorFormat.GetViewPage("simple"); //addedView == viewPage

var html = RazorFormat.RenderToHtml(viewPage, new { Name = "World" });

html.Print(); //= "This is my sample view, Hello World!"