我使用默认的开箱即用实现进行了测试,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尝试过它。它似乎没有产生影响。
答案 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!"