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