首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rotativa PDF in model - ControllerContext

Rotativa PDF in model - ControllerContext
EN

Stack Overflow用户
提问于 2015-05-04 15:19:47
回答 1查看 3.7K关注 0票数 4

我正在使用Rotativa从动作/视图生成PDF,它工作得很好。但是,是否可以在模型内部使用它,或者您是否可以仅在控制器中使用它?

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

代码语言:javascript
复制
var pdfResult = new ActionAsPdf("GeneratePDF", "PDF");

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

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

EN

回答 1

Stack Overflow用户

发布于 2016-02-12 06:13:12

您可以使用以下代码来实例化控制器,然后通过该实例配置ControllerContext -从应用程序中的任何位置。

代码语言:javascript
复制
/// <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;
}

这可以像这样使用:

代码语言:javascript
复制
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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30024617

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档