2016-03-28 16 views
7

Ho creato Web Api e MVC combinati per l'applicazione web a pagina singola. Voglio chiamare web api e renderizzare il controller mvc per creare pdf dalla vista usando Rotativa api. Il problema è quando accedo al controller mvc in web api non funziona.Come accedere al controller mvc nel controller web api per ottenere il pdf dalla vista

Come accedere al controller mvc in web api per ottenere il pdf dalla vista?

Nota: oggetto controller mvc dichiarato in web api, quindi "ControllerContext" è nullo nel metodo "GetPdfBytesFormView".

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 Controller:

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 web API chiamata

$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

Che cosa significa "non funziona"? In * in che modo * questo fallisce? – David

+0

@David, oggetto controller mvc dichiarato in web api quindi dà "ControllerContext" è null nel metodo "GetPdfBytesFormView". –

+0

che sarebbe corretto in quanto il contesto non era impostato quando lo hai dichiarato. Il framework normalmente gestisce tutto questo per te quando chiami il controller, ma poiché lo stai facendo manualmente non è impostato. – Nkosi

risposta

0

Prova facendo ri posizionando la tua GetRequestionPdf con sotto uno:

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

Finalmente ottenere soluzione.

Diciamo che il nome del controller è "PDFController" e il nome dell'azione è "GetPDF". Scrivi il seguente codice nel tuo controller 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(); 

Ora hai finito. Il tuo pdf dovrebbe essere generato.

Spero che sia utile

+0

Ma chi è "controller" nelle ultime 2 righe? – rochasdv

+0

Oggetto del controller in cui esiste il metodo GetPDF, ad esempio controller PdfController = new PdfController ( – Naveen

Problemi correlati