通常我会用这个:
private byte[] GetInvoiceAsPdf(string id)
{
var model = Utilities.GetModel(id);
ViewData.Model = model;
var view = ViewEngines.Engines.FindView(ControllerContext, "PDFLayout", null);
byte[] pdfBuf;
using (var writer = new StringWriter())
{
var context = new ViewContext(ControllerContext, view.View, ViewData, TempData, writer);
view.View.Render(context, writer);
writer.Flush();
string content = writer.ToString();
pdfBuf = Utilities.ConvertHtmlToPdf(content);
if (pdfBuf == null)
throw new Exception("Invalid pdfBuffer when creating the pdf file.");
}
return pdfBuf;
}
当我在控制器内执行此操作时,这非常有用。但是现在我需要将其移动到DLL文件中。如何从DLL文件中转换并使其工作?
问题在于ControllerContext
和ViewData
/ TempData
。在上面我直接设置了ViewData
因为我在控制器内部以及从控制器获得的上下文。
它仍然是一个MVC项目,只是将逻辑移动到DLL文件。
答案 0 :(得分:1)
发表评论作为回答:
解决方案是将来自控制器和其他资源的所有必要的上下文信息作为参数传递到函数中(或者如果公开公开所有必要的上下文,则简单地传递控制器的实例),然后像往常一样在函数中使用它们。这样,该函数将拥有完成任务所需的所有信息。