2016-03-28 86 views
7

我为单页网络应用程序创建了Web Api和MVC。我想调用Web API并使用Rotativa API来呈现mvc控制器以从视图创建PDF。问题是,当我访问Web API中的MVC控制器它不工作。如何在web api控制器中访问mvc控制器以从视图中获取pdf

我如何访问web api中的mvc控制器从视图中获取pdf?

注意:在web api中声明的mvc控制器对象,所以它在“GetPdfBytesFormView”方法中给出“ControllerContext”为null。

的Web API:

[RoutePrefix("api/reports/TestReport")] 
public class TestReportController : ApiController 
{  
    [HttpPost] 
    [Route("GetRequistionPdf")] 
    public HttpResponseMessage GetRequistionPdf(modelClass oModel) 
    {  
     HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK, "value"); 
     ReportController _Report = new ReportController(); 
     response.Content = new ByteArrayContent(_Report.GetPdfBytesFormView(oModel));  
     response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf");    
     return response; 
    } 
} 

MVC控制器:

public class ReportController : Controller 
{  
    public ActionResult GenerateReport(modelClass oModel) 
    { 
     return View(oModel); 
    } 

    public byte[] GetPdfBytesFormView(modelClass oModel) 
    {    
     var actionPDF = new Rotativa.ActionAsPdf("GenerateReport", oModel) 
     {     
      PageSize = Size.A4, 
      PageOrientation = Orientation.Portrait, 
      PageMargins = { Left = 6, Right = 7 } 
     }; 

     byte[] applicationPDFData = actionPDF.BuildPdf(ControllerContext);    
     return applicationPDFData; 
    } 
} 

Angularjs网络API调用

$http.post('http://localhost:54527/api/reports/TestReport/GetRequistionPdf', { data }, { responseType: 'arraybuffer' }) 
       .success(function (data) { 
        var file = new Blob([data], { type: 'application/pdf' }); 
        var fileURL = URL.createObjectURL(file); 
        window.open(fileURL); 
       }); 
+3

“它不工作”是什么意思? *以什么方式*失败? – David

+0

@David,在web api中声明的mvc控制器对象,所以它给出“ControllerContext”在“GetPdfBytesFormView”方法中为null。 –

+0

这将是正确的,因为上下文没有设置时,你宣布它。当您调用控制器时,框架通常会为您处理所有这些问题,但由于您正在手动执行此操作,因此未设置该框架。 – Nkosi

回答

0

试图通过重新把你的GetRequestionPdf与下面的一个:

public HttpResponse GetRequistionPdf(modelClass oModel) 
    {  
     HttpResponse response = HttpContext.Current.Response; 
     ReportController _Report = new ReportController(); 

       response.Clear() 
       response.ClearContent() 
       response.ClearHeaders() 
       response.Buffer = True 
       response.ContentType = "application/pdf" 
       response.AddHeader("Content-Disposition", "attachment;filename=xyz.pdf") 
       response.BinaryWrite(_Report.GetPdfBytesFormView(oModel)); 
       response.End() 


     return response; 
    } 
2

最后得到解决方案。

假设您的控制器名称为“PDFController”,操作名称为“GetPDF”。在您的api控制器中写入以下代码:

// Add key value  
    RouteData route = new RouteData(); 
    route.Values.Add("action", "GetPDF"); // ActionName 
    route.Values.Add("controller", "PDF"); // Controller Name 
    System.Web.Mvc.ControllerContext newContext = new System.Web.Mvc.ControllerContext(new HttpContextWrapper(System.Web.HttpContext.Current), route, controller); 
    controller.ControllerContext = newContext; 
    controller.GetPDF(); 

您现在就完成了。您的pdf应该会生成。

希望它有帮助

+0

但是,谁是最后2行中的“控制器”? – rochasdv

+0

您的方法GetPDF存在的控制器对象,即PdfController controller = new PdfController( – Naveen