我正在使用MVC 4来创建应用程序。 我正在使用Rotativa创建一个pdf。 我用一个复杂的模型调用ActionAsPdf
我的模型是
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);
}
但是由于某种原因,当我将其传递给操作时,所有数据都会传递到巡航选项..设置为无元素...这怎么可能?
太晚了,但是按照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 });
}
这太晚了,但我没有看到这个特定问题的很多答案,而且我已经为此挣扎了很长时间。
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 呈现的如此简单的方法来说,这似乎需要做很多工作......但如果你足够绝望...