将渲染的Razor视图另存为HTML字符串

时间:2019-03-17 17:36:56

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

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

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

如何将HTML传递回Action,如果必须在渲染前对其进行处理,那么该怎么做。

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

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

TIA

HTML Pre rendering HTML Post Rendering

1 个答案:

答案 0 :(得分:0)

您可以使用中间件来获取发送到浏览器的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