【问题标题】:Rotativa PDF in model - ControllerContext模型中的 Rotativa PDF - ControllerContext
【发布时间】:2015-05-04 07:19:46
【问题描述】:

我正在使用 Rotativa 从动作/视图生成 PDF,效果很好。 但是可以在模型内部使用它还是可以纯粹在控制器中使用它?

问题是函数想要使用模型没有的 ControllerContext

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

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

我的最终结果是,如果有其他方法,我希望 PDF 保存在字节数组中

【问题讨论】:

    标签: c# .net asp.net-mvc rotativa


    【解决方案1】:

    您可以使用以下代码来实例化控制器,然后通过该实例配置 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

    【讨论】:

      猜你喜欢
      • 2015-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-11
      • 1970-01-01
      • 1970-01-01
      • 2014-09-27
      • 1970-01-01
      相关资源
      最近更新 更多