You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Core 6项目中FastReport工具栏打印按钮点击事件实现咨询

在.NET Core 6中监听FastReport打印按钮事件并记录打印日志

针对你的需求,这里提供两种可行的实现方案,核心思路是拦截打印动作并触发数据库写入操作:

方案一:前端拦截打印按钮点击事件(推荐,适用于Web预览场景)

FastReport Web预览器的工具栏基于前端JS渲染,我们可以通过监听打印按钮的点击事件,先调用后端接口记录打印信息,再执行原生打印动作。

1. 前端JavaScript代码

在渲染FastReport预览的页面中添加以下脚本,注意根据你的FastReport版本调整按钮选择器:

document.addEventListener('DOMContentLoaded', function() {
    // 定位FastReport打印按钮(根据实际DOM结构调整选择器,示例为常见的类名)
    const printButton = document.querySelector('.fr-toolbar .fr-btn-print');
    if (!printButton) return;

    // 保存原生点击逻辑
    const originalPrintHandler = printButton.onclick;

    // 替换为自定义点击逻辑
    printButton.onclick = async function(e) {
        e.preventDefault();
        
        try {
            // 1. 获取当前发票ID(从页面模型或隐藏域读取,此处示例从Razor模型获取)
            const invoiceId = '@Model.InvoiceId';
            
            // 2. 调用后端API记录打印日志
            await fetch('/api/Invoice/RecordPrint', {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json',
                    'RequestVerificationToken': document.querySelector('input[name="__RequestVerificationToken"]').value
                },
                body: JSON.stringify({
                    InvoiceId: invoiceId,
                    PrintDateTime: new Date().toISOString()
                })
            });

            // 3. 执行原生打印动作
            originalPrintHandler.call(this, e);
        } catch (error) {
            console.error('打印日志记录失败:', error);
            // 可选:即使日志记录失败,仍允许执行打印
            originalPrintHandler.call(this, e);
        }
    };
});

2. 后端API实现

创建一个API接口用于接收打印日志并写入数据库:

[ApiController]
[Route("api/[controller]")]
public class InvoiceController : ControllerBase
{
    private readonly AppDbContext _dbContext;

    public InvoiceController(AppDbContext dbContext)
    {
        _dbContext = dbContext;
    }

    [HttpPost("RecordPrint")]
    public async Task<IActionResult> RecordPrint([FromBody] PrintLogDto request)
    {
        if (string.IsNullOrWhiteSpace(request.InvoiceId))
            return BadRequest("发票ID不能为空");

        var printLog = new PrintLog
        {
            InvoiceId = request.InvoiceId,
            PrintDateTime = DateTime.Parse(request.PrintDateTime),
            PrintedBy = User.Identity?.Name ?? "匿名用户" // 可选:记录打印人
        };

        _dbContext.PrintLogs.Add(printLog);
        await _dbContext.SaveChangesAsync();

        return Ok();
    }

    // 数据传输对象
    public class PrintLogDto
    {
        public string InvoiceId { get; set; }
        public string PrintDateTime { get; set; }
    }
}

注意事项

  • 确认FastReport打印按钮的DOM选择器:打开浏览器开发者工具,查看按钮的类名或属性(部分版本使用[data-action="print"]作为选择器)。
  • 处理API异常:根据业务需求决定是否在日志记录失败时阻止打印。
  • 防伪造令牌:确保请求中携带__RequestVerificationToken,避免400错误。

方案二:服务器端监听FastReport打印事件(适用于服务器端打印场景)

如果你的打印是通过服务器端直接发送到打印机(而非浏览器打印),可以利用FastReport的Report.Printing事件:

var report = new Report();
report.Load("path/to/your/invoice.frx");
report.RegisterData(invoiceData);

// 绑定打印事件
report.Printing += (sender, e) =>
{
    // 写入打印日志到数据库
    var printLog = new PrintLog
    {
        InvoiceId = invoiceData.Id,
        PrintDateTime = DateTime.Now,
        PrintedBy = User.Identity?.Name
    };
    _dbContext.PrintLogs.Add(printLog);
    _dbContext.SaveChanges();
};

// 执行服务器端打印
report.Print();

内容的提问来源于stack exchange,提问作者Rehan Khan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 03:30:33