【问题标题】:Save a Rendered Razor View as HTML string将渲染的 Razor 视图另存为 HTML 字符串
【发布时间】: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。

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


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-14
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多