2013-12-19 1 views
0

MVC 4를 사용하여 응용 프로그램을 만듭니다. 나는 Rotativa를 사용하여 pdf를 만들었습니다. 나는 복잡한 모델과 ActionAsPdf를 호출하고복합체 모델을 Rotativa에 전달하는 방법은 무엇입니까?

내 모델은

public class BrandingDetails 
    { 
     public int PDFFileNo { get; set; } 
     public string LogoImageUrl { get; set; } 
     public string WebsiteUrl { get; set; } 
     public string PhoneNumber_AU { get; set; } 
     public string PhoneNumber_NZ { get; set; } 
     public string FacebookImageUrl { get; set; } 
     public string TwitterImageUrl { get; set; } 
     public string PinterestImageUrl { get; set; } 
     public string YoutubeImageUrl { get; set; } 
     public string CruiseCode { get; set; } 
     public string ShipName { get; set; } 
     public string PortName { get; set; } 
     public string SailDate { get; set; } 
     public string CruiseNights { get; set; } 
     public string Destinations { get; set; } 
     public string QuoteRef { get; set; } 
     public string CruiseName { get; set; } 
     public string DescriptionCruise { get; set; } 

     public IEnumerable<CruiseOptions> CruiseOptions { get; set; } 

    } 

내가 그것을 호출하는 다음

var viewModel = QuoteHelper.GetViewModel(item); 

var pdfResult = new ActionAsPdf("CruiseDetails", quoteDetails, cruiseOptions); 


var binary = pdfResult.BuildPdf(this.ControllerContext); 

내 작업 방법

public ActionResult CruiseDetails(BrandingDetails quoteDetails, IEnumerable<CruiseOptions> cruiseOptions) 
     { 

      return View("CruiseDetails", quoteDetails); 

     } 

하지만입니다 부르고있다 어떤 이유로 모든 데이터가 전달 된 Action에 전달할 때 CruiseOptions .. no el로 설정됩니다. ements ... 그것은 어떻게 가능합니까?

+0

나는 그 원인을 알지 못합니다. 결과를 표시하고 멋진 것을 시도하지 않고 선택한 Cruise 옵션에 대한 설명이 들어있는 문자열 변수를 추가하고 전달하십시오. 최악의 경우, 당신은 인간의 개입없이 '자동적으로'반사를 통해 그것을 얻을 수 있습니다. –

답변

3

이것은 너무 늦기는하지만,이 특정 문제에 대한 많은 답변을 보지 못했으며, 오랜 시간 동안 고민했습니다.

Rotativa의 ActionToPdf는 비 기본 유형을보기로 이식 할 수 없습니다. 더 보잘것없는 복잡한 객체는 수신 컨트롤러가 이해할 수있는 GET 쿼리 문자열로 변환 할 방법이 없습니다. 이것은 불행히도 모든 열거 가능한 컨테이너 클래스가 있음을 의미합니다.

길이가 짧기 때문에이 문제는 Rotativa가 UrlHelper 클래스의 Action() 메서드에 의존하여 경로 값을 포트하고 wkhtmltopdf에서보기를 생성하도록 허용하기 때문에 발생합니다. 새로운 ActionToPdf()를 호출하면 Action()은 입력 라우팅 객체를 반영하고 속성을 반복하여 모델의 속성 이름 및 관련 값과 키 - 값 쌍으로 구성된 쿼리 문자열을 만듭니다. 이 값은 ToString() 메서드를 사용하여 파생됩니다.

더 복잡한 데이터 유형의 경우이 값을 값에 지정하면 클래스 이름이 생성됩니다. Rotativa는이 데이터를 사용하여 쿼리 문자열을 생성하고이를 생성 된 wkhtmltopdf 드라이버에 전달합니다.이 드라이버는 여러 쿼리 변수를 사용하여 의도 한 페이지에 도달합니다. 당신이 그것을 실행으로 Rotativa 코드를 단계별 경우,이 URL이 내장되는 것을 볼 것이며, 텍스트에서 비주얼은 문자열의 그것은 의심 할 여지없이,이 같은 에스피 뭔가를 할 것이다 구축 것 :

http://localhost/Home/About?yourModelsList=System.Collections.Generics.List&someOtherParameter=... 

수신 제어 방법 가져 이 데이터는 이러한 모든 쿼리 변수를 모델에 바인딩하려고 시도하지만 쿼리 문자열에서 열거 가능 필드의 값을 무시하므로 목록에 아무것도 포함되지 않습니다.

나는이 모든 것에 대한 훌륭한 해결 방법을 전혀 모른다. 지금까지 만장일치로 특정 경로를 만났습니다. 코드 품질 희생이 필요했습니다 ... 저도 커밋하기가 싫지만 그 당시 다른 길은 보지 못했습니다.

저는 세션 변수에 뷰 데이터를 저장하고 wkhtmltopdf가 호출 할 때 컨트롤러를 통해 뷰 데이터를 가져 오는 것을 생각해 보았습니다. 그러나 이것은 다소 불편한 습관을 필요로합니다. (유선에서 세션 ID 공유는 좋은 보안 관행이 아닙니다. 모든). 또한 객체를 직렬화하여 데이터베이스 백엔드에 저장하고 PDF 렌더링 컨트롤러가 실행되는 동안 어떻게 든 검색 할 수 있습니다. Rotativa API가 제공하는 간단한 방법에 대한 많은 작업처럼 보입니다.하지만 충분히 절박한 경우 ...

4

Josh의 대답에 이어 JSON을 사용하여 해결책을 찾았습니다. 나는 이것이 누군가를 돕기를 바랍니다.

public class SalesReportModel : BaseModel 
{ 
    public List<Guid> UserGuids { get; set; } 
    public DateTime StartDate { get; set; } 
    public DateTime EndDate { get; set; }  
} 

public ActionResult GenerateSalesReport(string json) 
{ 
    SalesReportModel model = new JavaScriptSerializer().Deserialize<SalesReportModel>(json); 
    return View("SalesReport", model); 
} 

public ActionResult SalesReport(SalesReportModel model) 
{ 
    var json = new JavaScriptSerializer().Serialize(model); 
    return new Rotativa.ActionAsPdf("GenerateSalesReport", new { json = json });    
} 
+0

정말이 답변을 주셔서 감사합니다, 매력처럼 작동합니다, 나는 +1 이상 줄 수 있었으면 좋겠 :) – Blossom

관련 문제