2016-03-28 82 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