首页 > 解决方案 > 将渲染的 Razor 视图另存为 HTML 字符串

问题描述

是否有可能,一旦 aRazor View在浏览器中呈现,HTML 和标记的内容(图像、表格、数据等)可以保存为字符串或其他类型?

我希望能够Razor View为客户生成检查输出中的一切是否正常,然后我希望他们单击​​一个保存所有 HTML 的按钮(没有所有剃刀标记等)。

你如何将 HTML 传递回一个Action,如果它必须被处理预渲染,那么这也能做到。

然后我可以使用它来生成 PDF 并节省处理时间,因为我会将字符串保存在数据库中。

顺便说一句,这不是局部视图,也不会使用局部视图,而且我知道在 Razor 视图中仍有一些问题需要修复,此时我对保存 HTML 更感兴趣。

TIA

HTML 预渲染 HTML 后期渲染

标签: c#htmlasp.net-core-2.0razor-pages

解决方案


您可以使用中间件来获取发送到浏览器的 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。Configure尽早在 Startup 的方法中注册中间件:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
        app.UseHsts();
    }
    app.UseMiddleware<ResponseToStringMidleware>();
    ...
}

更多信息:Razor 页面中的中间件


推荐阅读