将渲染的 Razor 视图另存为 HTML 字符串
Posted
技术标签:
【中文标题】将渲染的 Razor 视图另存为 HTML 字符串【英文标题】:Save a Rendered Razor View as HTML string 【发布时间】:2019-08-08 03:33:09 【问题描述】:是否可以在浏览器中呈现Razor View
后,html 和标记的内容(图像、表格、数据等)可以保存为字符串或其他类型?
我希望能够为客户生成Razor View
,以检查输出中的一切是否正常,然后我希望他们单击一个按钮来保存所有 HTML(没有所有剃刀标记等) .
如何将 HTML 传递回Action
,如果必须进行预渲染处理,那么如何也可以这样做。
然后我可以使用它来生成 PDF 并节省处理时间,因为我会将字符串保存在数据库中。
顺便说一句,这不是局部视图,也不会使用局部视图,而且我知道 Razor 视图中还有一些问题需要修复,此时我对保存 HTML 更感兴趣。
TIA
HTML Pre rendering HTML Post Rendering
【问题讨论】:
客户将检查什么?请记住,虽然 HTML 可能是正确的,但它可能会引用未在 HTML 中呈现的 javascript、图像或 css。除非客户要直接查看 HTML,否则仅拥有解决方案的这一部分可能实际上并没有帮助。我怀疑你会通过创建一个 UAT 环境,并在那里发布你的实际代码,让客户看到“真正的”网站做得更好。 作为 QA 流程的一部分,他们必须检查页面上显示的数据是否正确。如果可能的话,我很乐意渲染页面服务器端(在内存中)。我还可以编辑字符串以删除 QA 应该使用 QA/UAT 环境,并查看实际输出,而不是在他们看到之前可能已经调整过的一些“快照”。 我认为你误解了一些事情。这与 UAT 环境无关,它向客户展示了他们自己在两个日期之间的一小部分数据。 QA 人员是机械技术人员,他们不需要 UAT。 【参考方案1】:您可以使用中间件获取发送到浏览器的 HTML 的副本。创建一个名为ResponseToString
的类,内容如下:
public class ResponseToStringMidleware
RequestDelegate _next;
public ResponseToStringMidleware(RequestDelegate next)
_next = next;
public async Task Invoke(HttpContext context)
var isHtml = context.Response.ContentType?.ToLower().Contains("text/html");
Stream responseBody = context.Response.Body;
using (var memoryStream = new MemoryStream())
context.Response.Body = memoryStream;
await _next(context);
if (context.Response.StatusCode == 200 && isHtml.GetValueOrDefault())
memoryStream.Position = 0;
string html = new StreamReader(memoryStream).ReadToEnd();
// save the HTML
memoryStream.Position = 0;
await memoryStream.CopyToAsync(responseBody);
用一些代码替换// save the HTML
以根据需要保留HTML。尽早在 Startup 的 Configure
方法中注册中间件:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
if (env.IsDevelopment())
app.UseDeveloperExceptionPage();
else
app.UseExceptionHandler("/Error");
app.UseHsts();
app.UseMiddleware<ResponseToStringMidleware>();
...
更多信息:Middleware in Razor Pages
【讨论】:
以上是关于将渲染的 Razor 视图另存为 HTML 字符串的主要内容,如果未能解决你的问题,请参考以下文章
iPhone:如何将视图另存为图像??? (例如保存你画的东西)