问题描述
我的 Controller 类中有两个操作方法:
我的问题是 SaveAsPDF Action 方法。在这里,我尝试使用 Rotativa ActionAsPdf 和随后的 BuildFile 方法来生成和保存 PDF。但是,在执行“BuildFile”这一行时,它没有在我的 DetailsAll Action 方法中遇到断点,从而导致 PDF 生成为空白。
你能帮我哪里出错吗?
[HttpGet]
public ActionResult DetailsAll()
{
var selectionBuilder = builderFactory.GetGeocodeReportSelectionviewmodelBuilder();
var companyList = selectionBuilder.Build();
List<GeocodeReportviewmodel> viewmodel = new List<GeocodeReportviewmodel>();
foreach(SelectListItem record in companyList.Companies)
{
var builder = builderFactory.GetGeocodeReportviewmodelBuilder(int.Parse(record.Value));
viewmodel.Add(builder.Build());
}
var model = new AllGeocodeReportviewmodel
{
GeocodeReports = viewmodel
};
return View(model);
}
[HttpGet]
public string SaveAsPDF()
{
var report = new ActionAsPdf("DetailsAll")
{
FileName = "OEM_GeocodeReport_" + System.DateTime.Now.ToString("MMYY") + ".pdf",PageSize = Size.A4,PageOrientation = Orientation.Landscape,PageMargins = { Left = 1,Right = 1 }
};
byte[] pdf = report.BuildFile(ControllerContext);
System.IO.File.WriteallBytes("C:\\" + report.FileName,pdf);
return "true";
}
解决方法
经过广泛搜索,终于找到了这个问题。我需要将身份验证 cookie 与 BuildFile 请求一起发送才能使其工作。添加了以下代码,现在可以正确生成 PDF:
public void SaveAsPDF()
{
var cookies = Request.Cookies.AllKeys.ToDictionary(k => k,k => Request.Cookies[k].Value);
var report = new ActionAsPdf("DetailsAll")
{
FileName = "OEM_GeocodeReport_" + System.DateTime.Now.ToString("MMyy") + ".pdf",PageSize = Size.A4,PageOrientation = Orientation.Portrait,PageMargins = { Left = 3,Right = 3 },FormsAuthenticationCookieName = System.Web.Security.FormsAuthentication.FormsCookieName,Cookies = cookies
};
byte[] pdf = report.BuildFile(ControllerContext);
System.IO.File.WriteAllBytes("C:\\" + report.FileName,pdf);
}