用于Razor的ServiceStack InMemoryVirtualPathProvider - GetViewPage null

时间:2017-04-20 13:37:23

标签: servicestack servicestack-razor

我使用默认的开箱即用实现进行了测试,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

此外,这返回true:razor.VirtualFileSources.FileExists("~/views/"+email.BlastId + ".cshtml")我没有使用views文件夹/ etc尝试过它。它似乎没有产生影响。

1 个答案:

答案 0 :(得分:3)

RazorFormat在Startup上加载已编译的视图,因此视图需要在注册VirtualFileSources之前RazorFormat中存在,以便GetViewPage()可以使用该视图。

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

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

如果您只想创建临时Razor View,可以致电CreatePage()创建视图:

var razorView = razorFormat.CreatePage(razorHtml);

用以下方式渲染:

razorFormat.RenderToHtml(razorView, model);

或者如果Razor Page和模型都是临时的,它可以在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!"