Skip to content

Instantly share code, notes, and snippets.

@fabiomaulo
Created April 3, 2020 03:47
Show Gist options
  • Save fabiomaulo/782d052182b1ea7faae2d3bc3aa3733a to your computer and use it in GitHub Desktop.
Save fabiomaulo/782d052182b1ea7faae2d3bc3aa3733a to your computer and use it in GitHub Desktop.
Return a view as download html file
public class HtmlFileResult : FileResult
{
private readonly ControllerContext controllerContext;
private readonly string viewToRender;
private readonly object model;
public HtmlFileResult(ControllerContext controllerContext, string viewToRender, object model, string fileDownloadName) : base("text/html")
{
if (string.IsNullOrWhiteSpace(viewToRender))
{
throw new ArgumentException("The view name is required", nameof(viewToRender));
}
if (string.IsNullOrWhiteSpace(fileDownloadName))
{
throw new ArgumentException("The file name is required", nameof(fileDownloadName));
}
FileDownloadName = fileDownloadName;
this.controllerContext = controllerContext ?? throw new ArgumentNullException(nameof(controllerContext));
this.viewToRender = viewToRender;
this.model = model ?? throw new ArgumentNullException(nameof(model));
}
protected override void WriteFile(HttpResponseBase response)
{
const int DefaultStreamWriterBufferSize = 4096;
var result = ViewEngines.Engines.FindView(controllerContext, viewToRender, null);
using (TextWriter textWriter = new StreamWriter(response.OutputStream, Encoding.UTF8,
bufferSize: DefaultStreamWriterBufferSize, leaveOpen: true))
{
var viewContext = new ViewContext(controllerContext, result.View, new ViewDataDictionary(model), controllerContext.Controller.TempData, textWriter);
result.View.Render(viewContext, textWriter);
result.ViewEngine.ReleaseView(controllerContext, result.View);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment