Created
April 3, 2020 03:47
-
-
Save fabiomaulo/782d052182b1ea7faae2d3bc3aa3733a to your computer and use it in GitHub Desktop.
Return a view as download html file
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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