直到最近,我才用谷歌图表运行一些 pdf 报告,突然谷歌图表不会出现。报告的其余部分工作正常。我正在使用 razor 视图引擎来运行一个模板文件,该文件具有 javascript 来加载谷歌图表。
模板文件有一个initCharts()
由<body onload=initCharts()>
. 该函数加载谷歌图表如下:
<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
<script type="text/javascript">
function initChart() {
google.charts.load('current', {'packages':['corechart']});
google.charts.setOnLoadCallback(drawCharts);
}
other functions to load various charts
然后这个模板文件由 razor 视图引擎加载,如下所示:
public async Task<string> RenderToStringAsync(string viewName, object model, string logoUrl)
{
Dictionary<object, object> dictionary = new Dictionary<object, object>();
dictionary.Add("LogoUrl", logoUrl);
var httpContext = new DefaultHttpContext { RequestServices = _serviceProvider, Items = dictionary };
var actionContext = new ActionContext(httpContext, new RouteData(), new ActionDescriptor());
using (var sw = new StringWriter())
{
var viewResult = _razorViewEngine.FindView(actionContext, viewName, false);
if (viewResult.View == null)
{
throw new ArgumentNullException($"{viewName} does not match any available view");
}
var viewDictionary = new ViewDataDictionary(new EmptyModelMetadataProvider(), new ModelStateDictionary())
{
Model = model
};
var viewContext = new ViewContext(
actionContext,
viewResult.View,
viewDictionary,
new TempDataDictionary(actionContext.HttpContext, _tempDataProvider),
sw,
new HtmlHelperOptions()
);
await viewResult.View.RenderAsync(viewContext);
return sw.ToString();
}
}
razorview 引擎的输出(来自RenderToStringAsync
函数)被提供给 DinkToPdf 库以转换为 pdf。
我遇到的问题是,当google.charts.load
行执行时,它会失败或者在它可以加载 JavaScript 之前,razorview 返回 html。javascript 不在 razorview 中执行,因此图表不会被渲染。但是,如果我将输出复制到 HTML 文件并使用浏览器打开它,图表将按预期工作。javascript 似乎没有在 razorview 引擎内执行google.charts.load
。
无论如何我可以看到在razorview引擎中执行javascript的结果吗?如果有错误,我可以看到错误吗?我可以加载像谷歌这样的第三方脚本并在 razorview 引擎中执行吗?
我花了很多时间都无济于事。您的帮助将不胜感激!