2015-05-04 3 views
2

Я использую Rotativa для создания PDF-файлов из действий/представлений, и он отлично работает. Однако можно ли использовать его внутри моделей или вы можете использовать его только в контроллерах?Rotativa PDF в модели - ControllerContext

Вопрос заключается в том, что функция хочет использовать ControllerContext, какие модели не имеют

var pdfResult = new ActionAsPdf("GeneratePDF", "PDF"); 

byte[] pdfFile = pdfResult.BuildPdf(this.ControllerContext); 

Мой конечный результат в том, что я хочу, PDF в массив байтов, если есть и другие способы сделать это

ответ

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); 

Ссылка: http://weblog.west-wind.com/posts/2013/Jul/15/Rendering-ASPNET-MVC-Razor-Views-outside-of-MVC-revisited

Смежные вопросы