【问题标题】:jsReport How to get data dynamically using AJAX GET Request?jsReport 如何使用 AJAX GET 请求动态获取数据?
【发布时间】:2017-08-04 18:14:05
【问题描述】:

我想使用 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);
    });
};   

我检查了硬编码和值,它可以工作,但在动态获取数据时遇到问题。

【问题讨论】:

    标签: javascript jquery ajax asp.net-core jsreport


    【解决方案1】:

    我设法卖掉了这个。问题是我试图在服务器上运行客户端脚本,这实际上没有任何意义。所以我通过在我在服务器上运行的脚本中发出 get 请求来修复它。最终结果:

    module.exports = function (callback) {
    var request = require("request");
    var getResponse = null;
    
    request.get({
        url: '/Home/testReport',
        json: true,
    }, function (error, response, body) {
        if (!error && response.statusCode == 200)
            getResponse = body;
        });
    
    var jsreport = require('jsreport-core')();
    
    jsreport.init().then(function () {
        return jsreport.render({
            template: {
                content: 'template bla  bla bla',
                engine: 'jsrender',
                recipe: 'phantom-pdf'
            },
            data: getResponse
        }).then(function (resp) {
            callback(/* error */ null, resp.content.toJSON().data);
        });
    }).catch(function (e) {
        callback(/* error */ e, null);
    });
    

    };

    【讨论】:

    • Mirel,这段代码可能已经测试成功,但它非常脆弱——它不是一个可靠的解决方案。 request.get() 是异步的,jsreport.init() 也是如此。无法保证哪个会首先响应 - 可能是 a...b 或 b...a 。您确实可以并行启动两个异步进程,但您需要使用 Promise.all() 等待 both 在尝试渲染之前解决。
    【解决方案2】:

    获取数据只是另一个异步任务,因此将其包含在您的承诺链中,以便将数据交付到需要的地方。

    假设您正在使用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 的内容均已删除。通过从函数返回一个承诺,调用者可以将.then(...).catch(...); 链接到函数调用,而无需传递回调(至少,不同的方式)。

    【讨论】:

    • 嗨,我想知道 $.get('Home/testReport',{},function(...)) 将去哪里,以便从 URL 获取数据。对不起,如果这是一个愚蠢的问题,但这是第一次使用 jquery/js
    • javascript应该在哪里运行?这个问题令人困惑,module.exportsrequire 暗示服务器端 Node.js,ASP.new-core 标记暗示 ASP,现在您提到 $.get() 暗示客户端 JavaScript。我的回答假设 Node.js。
    • 我明白你的意思,我不匹配这些脚本的执行位置。谢谢1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多