.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
相关产品推荐
相关产品推荐

