我想使用jsreport在我的网站上动态生成一些报告(asp.net核心应用程序),我在控制器中有一个返回JSON的方法,我想从那里使用jsReport来填充数据报告。
我会发布一些测试值。 的控制器
public JsonResult testReport()
{
FileStream fs = new FileStream("path\\json.txt", FileMode.Open);
using (StreamReader r = new StreamReader(fs))
{
var model = r.ReadToEnd();
test json = JsonConvert.DeserializeObject<test>(model);
return Json(json);
}
}
[HttpGet]
public async Task<IActionResult> MyAction([FromServices] INodeServices nodeServices)
{
var result = await nodeServices.InvokeAsync<byte[]>
("./pdf");
HttpContext.Response.ContentType = "application/pdf";
string filename = @"report.pdf";
HttpContext.Response.Headers.Add("x-filename", filename);
HttpContext.Response.Headers.Add("Access-Control-Expose-Headers", "x-filename");
HttpContext.Response.Body.Write(result, 0, result.Length);
return new ContentResult();
}
以及在该页面上运行的实际脚本:
module.exports = function (callback) {
var jsreport = require('jsreport-core')();
jsreport.init().then(function () {
return jsreport.render({
template: {
content: 'template bla bla bla',
engine: 'jsrender',
recipe: 'phantom-pdf'
},
data: /* i don`t know how to get data from (/Home/testReport) */
}).then(function (resp) {
callback(/* error */ null, resp.content.toJSON().data);
});
}).catch(function (e) {
callback(/* error */ e, null);
});
};
我已经使用硬编码和值进行了检查并且它有效,但在动态获取数据方面我遇到了问题。
答案 0 :(得分:0)
获取数据只是另一个异步任务,因此将其包含在您的承诺链中,以便将数据传递到需要的位置。
我们假设您使用fetch()
来获取数据......
module.exports = function () {
var jsreport = require('jsreport-core')();
return jsreport.init()
.then(function() {
return fetch({/* params */})
})
.then(function(fetchedData) {
return jsreport.render({
template: {
content: 'template bla bla bla',
engine: 'jsrender',
recipe: 'phantom-pdf'
},
data: fetchedData
});
});
};
注意:已删除所有提及callback
的内容。通过从函数返回promise,调用者可以将.then(...).catch(...);
链接到函数调用,而无需传递回调(至少,不是以相同的方式)。
答案 1 :(得分:0)
我成功解决了这个问题。问题是我试图在服务器上运行客户端脚本,实际上没有任何意义。所以我通过在服务器上运行的脚本中生成get请求来修复它。最终结果:
WEIGHT
};