在操作中获取生成的html文件

本文关键字:html 文件 操作 获取 | 更新日期: 2023-09-27 17:54:28

我有一个MVC控制器,它提供一个简单的视图

public class MyController : Controller {
    [HttpGet]
    public ActionResult Index() {
        return View();
    }
    [HttpGet]
    public ActionResult ZipIndex() {
        // Get the file returned bu Index() and zip it 
        return File(/* zip stream */);
    }
}

正如你从上面看到的,我需要实现的是一个方法,它得到Index()生成的html,压缩它,并返回一个可以下载的文件。

我知道如何压缩,但我不知道如何得到html。

在操作中获取生成的html文件

查看这篇文章http://approache.com/blog/render-any-aspnet-mvc-actionresult-to/。它提供了一种简洁的方式来将任何ActionResult的输出呈现为字符串。

编辑

基于上述文章中概述的技术,完整的解决方案可能如下所示

using System.IO;
using System.IO.Compression;
using System.Web;
public class MyController : Controller
{
    [HttpGet]
    public ActionResult Index()
    {
        return View();
    }
    [HttpGet]
    public FileContentResult ZipIndex()
    {
        // Render the View output: 
        var viewString = View("TheViewToRender").Capture(ControllerContext);
        // Create a zip file containing the resulting markup
        using (MemoryStream outputStream = new MemoryStream())
        {
            StreamReader sr = new StringReader(viewString);
            using (ZipArchive zip = new ZipArchive(outputStream, ZipArchiveMode.Create, false))
            {
                ZipArchiveEntry entry = zip.CreateEntry("MyView.html", CompressionLevel.Optimal);
                using (var entryStream = entry.Open())
                {
                    sr.BaseStream.CopyTo(entryStream);
                }
            }
            return File(outputStream.ToArray(), MediaTypeNames.Application.Zip, "Filename.zip");
        }
    }
}
public static class ActionResultExtensions {
    public static string Capture(this ActionResult result, ControllerContext controllerContext) {
        using (var it = new ResponseCapture(controllerContext.RequestContext.HttpContext.Response)) {
            result.ExecuteResult(controllerContext);
            return it.ToString();
        }
    }
}
public class ResponseCapture : IDisposable {
    private readonly HttpResponseBase response;
    private readonly TextWriter originalWriter;
    private StringWriter localWriter;
    public ResponseCapture(HttpResponseBase response) {
        this.response = response;
        originalWriter = response.Output;
        localWriter = new StringWriter();
        response.Output = localWriter;
    }
    public override string ToString() {
        localWriter.Flush();
        return localWriter.ToString();
    }
    public void Dispose() {
        if (localWriter != null) {
            localWriter.Dispose();
            localWriter = null;
            response.Output = originalWriter;
        }
    }
}