我正在使用Rotativa从动作/视图生成PDF并且效果很好。 但是可以在模型中使用它,还是纯粹在控制器中使用它?
问题是该函数想要使用一个模型没有的ControllerContext
var pdfResult = new ActionAsPdf("GeneratePDF", "PDF");
byte[] pdfFile = pdfResult.BuildPdf(this.ControllerContext);
我的最终结果是,如果还有其他方法可以将PDF放在字节数组中
答案 0 :(得分:4)
您可以使用以下代码实例化控制器,然后通过该实例配置ControllerContext - 从应用程序的任何位置开始。
/// <summary>
/// Creates an instance of an MVC controller from scratch
/// when no existing ControllerContext is present
/// </summary>
/// <typeparam name="T">Type of the controller to create</typeparam>
/// <returns>Controller Context for T</returns>
/// <exception cref="InvalidOperationException">thrown if HttpContext not available</exception>
public static T CreateController<T>(RouteData routeData = null)
where T : Controller, new()
{
// create a disconnected controller instance
T controller = new T();
// get context wrapper from HttpContext if available
HttpContextBase wrapper = null;
if (HttpContext.Current != null)
wrapper = new HttpContextWrapper(System.Web.HttpContext.Current);
else
throw new InvalidOperationException(
"Can't create Controller Context if no active HttpContext instance is available.");
if (routeData == null)
routeData = new RouteData();
// add the controller routing if not existing
if (!routeData.Values.ContainsKey("controller") && !routeData.Values.ContainsKey("Controller"))
routeData.Values.Add("controller", controller.GetType().Name
.ToLower()
.Replace("controller", ""));
controller.ControllerContext = new ControllerContext(wrapper, routeData, controller);
return controller;
}
这可以像:
一样使用QuotesController quotesController = ViewRenderer.CreateController<QuotesController>();
ViewAsPdf view = (ViewAsPdf)quotesController.Preview(model.Guid);
byte[] pdf = view.BuildPdf(quotesController.ControllerContext);
EmailService.Send(model, pdf);