2013-12-19 17 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時,所有數據都會通過Bar CruiseOptions ..它被設置爲no el ements ...這怎麼可能?

+0

我不知道是什麼原因引起的,但如果你只是顯示結果,沒有嘗試任何幻想,爲什麼不直接添加包含您所選擇的巡航選項的說明一個字符串變量和傳遞。最糟糕的情況是,你可以通過'自動'反射來獲得它,而不需要人爲干預。 –

回答

3

這是方式,方法爲時已晚,但我沒有看到很多答案這個特定的問題在那裏,我與它掙扎了很長的時間。

Rotativa的ActionToPdf無法將非基元類型移植到視圖中。更迂迴地說,複雜的對象沒有辦法翻譯成接收控制器將理解的GET查詢字符串。不幸的是,這意味着所有的枚舉容器類都沒有了。

這是因爲Rotativa依賴UrlHelper類的Action()方法來端口路由值並允許wkhtmltopdf生成視圖,所以出現此行爲。當您調用新的ActionToPdf()時,Action()會反映輸入路由對象並迭代其屬性,從而創建一個由鍵值對組成的查詢字符串以及您的模型的屬性名稱及其相關值。該值使用ToString()方法派生。

在更復雜的數據類型的情況下,這樣做的值將產生類名稱。 Rotativa將使用這些數據創建一個查詢字符串並將其傳遞給構建它的wkhtmltopdf驅動程序,該驅動程序隨後將使用大量查詢變量將其傳達到您的預期頁面。如果通過,因爲它執行Rotativa執行代碼,你會看到這個URL創建的,並在文本展示臺的字符串它的建設,無疑將ESPY是這樣的:

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

當接收控制器方法獲取這個數據雖然試圖將所有這些查詢變量綁定到您的模型,但它會從查詢字符串中丟棄可枚舉字段的值,導致列表中沒有任何內容。

我不知道這個很好的解決方法。迄今爲止,我已經一致地申請了特定於應用程序的路線,這需要一些...代碼質量的犧牲......我一直不喜歡承諾,但當時沒有看到另一種方式。

我設想將視圖數據存儲在一個Session變量中,並通過控制器檢索它,就像wkhtmltopdf調用它一樣,但這需要一些相當不愉快的做法(在線上共享會話ID並不是很好的安全實踐所有)。您也可以序列化對象,將其存儲在數據庫後端,並在PDF渲染控制器執行時以某種方式檢索它。這似乎是一個大量的工作,爲的Rotativa API禮物這麼簡單的方法...但如果你有足夠的絕望......

4

太晚了,但下面喬希的答案,我已經使用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