2

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

我将 RazorFormat 的 VirtualFileSource 换成了 inmemory 的:

 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")我在没有视图文件夹/等的情况下尝试过它。它似乎没有影响。

4

1 回答 1

3

RazorFormat启动时加载已编译的视图,因此视图需要在注册VirtualFileSources之前存在RazorFormat,以便它可以用于GetViewPage().

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

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

如果你只想创建一个临时的 Razor 视图,你可以调用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!"
于 2017-04-20T14:21:51.220 回答