能否通过Control Add-in渲染外部URL?Business Central Punchout应用问题
解决Business Central Punchout Control Add-in iframe空内容及函数绑定问题
针对你遇到的问题,从几个核心方向排查和修正:
1. 给Control Add-in添加基础HTML内容
你的Control Add-in没有指定Content属性,导致iframe内部没有任何DOM元素,即便脚本能运行,也无法在DOM检查中看到关联内容。
修改步骤:
- 在AL项目中创建一个
content.html文件(放在和scripts同级的目录),内容可以是简单的占位符:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Punchout Add-in</title> </head> <body> <div style="display:none;">Punchout Add-in Container</div> </body> </html>
- 在Control Add-in对象中添加
Content属性:
controladdin PunchoutCatalogAddIn { Content = './content.html'; // 新增这一行 StartupScript = './scripts/startup.js'; Scripts = './scripts/openurl.js'; // 其余属性保持不变 RequestedHeight = 700; MinimumHeight = 700; MaximumHeight = 700; RequestedWidth = 700; MinimumWidth = 700; MaximumWidth = 700; VerticalShrink = true; HorizontalShrink = true; VerticalStretch = true; HorizontalStretch = true; event ControlReady(); procedure OpenUrl(url: Text); }
2. 修正JS函数与Control Add-in Procedure的绑定方式
你当前通过自定义window.PunchoutCatalogAddIn对象的方式无法正确和BC的Control Add-in procedure关联,需要使用官方提供的RegisterExternalFunction方法注册函数。
修改openurl.js:
(function () { console.log("Add-in started"); // 用官方方法注册OpenUrl函数,关联到Control Add-in的procedure Microsoft.Dynamics.NAV.RegisterExternalFunction('OpenUrl', function(url) { console.log("Opening URL:", url); window.open(url, '_blank'); }); })();
3. 确保ControlReady事件在DOM就绪后触发
原StartupScript直接调用InvokeExtensibilityMethod,可能在DOM未完全加载时触发,导致后续逻辑异常。
修改startup.js:
// 等待DOM加载完成后再通知BC控件就绪 document.addEventListener('DOMContentLoaded', function() { Microsoft.Dynamics.NAV.InvokeExtensibilityMethod('ControlReady', []); console.log("Add-in initialized"); });
4. 验证资源文件的部署配置
确保AL项目中的content.html、startup.js、openurl.js文件的Build Action设置为Content,这样部署到Business Central时,这些文件会被正确打包并可访问。
完成以上修改后,重新发布你的Extension:
- iframe会加载content.html的内容,DOM检查时能看到对应的元素
OpenUrl函数会正确绑定到Control Add-in的procedure,点击"Open Catalog"按钮时能正常打开外部URL- ControlReady事件会在DOM就绪后触发,避免时序问题
内容的提问来源于stack exchange,提问作者Liam White
相关产品推荐
相关产品推荐

