将渲染的 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 字符串的主要内容,如果未能解决你的问题,请参考以下文章

自动将视图另存为带有额外列的表

将表单结果另存为 PDF

将 Razor 页面渲染为字符串

iPhone:如何将视图另存为图像??? (例如保存你画的东西)

PySpark:将临时视图转换为表格并在本地驱动器中另存为 .CSV

转置表格并另存为视图