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

能否通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 23:38:27