Azure Bot C#:WebChat中实现HeroCard在当前标签页打开URL
解决Azure Bot Service HeroCard在当前标签页打开URL的问题
我明白你的需求——现在用HeroCard的OpenUrl动作总是在新标签页打开链接,想改成当前标签页跳转对吧?其实这个问题的根源在于Web Chat的默认行为,而不是后端的C#代码,咱们一步步来解决:
问题原因
你后端用的ActionTypes.OpenUrl是Bot Framework的标准动作,但Web Chat为了安全和用户体验,默认会给这类链接加上target="_blank",强制在新标签页打开。后端的CardAction本身并没有提供参数来控制浏览器的打开方式,所以得从前端Web Chat的配置入手修改。
解决方案:自定义Web Chat的URL处理逻辑
你需要在嵌入Web Chat的前端代码里,添加一个自定义的store中间件,拦截Web Chat的打开URL动作,替换成当前标签页跳转的逻辑。以下是具体代码示例:
// 创建自定义store,拦截OPEN_URL动作 const store = window.WebChat.createStore( {}, ({ dispatch }) => next => action => { // 检测到打开URL的动作时 if (action.type === 'WEB_CHAT/OPEN_URL') { // 阻止Web Chat的默认新标签打开行为 action.preventDefault(); // 在当前标签页跳转目标URL window.location.href = action.payload.url; return; } // 其他动作按默认逻辑处理 return next(action); } ); // 渲染Web Chat时传入自定义store window.WebChat.renderWebChat( { directLine: window.WebChat.createDirectLine({ token: '你的Direct Line令牌' }), store // 传入自定义store }, document.getElementById('webchat') // 你的Web Chat容器元素 );
补充说明
- 这段代码通过中间件拦截了Web Chat内置的
WEB_CHAT/OPEN_URL动作,调用action.preventDefault()阻止默认行为,然后用window.location.href直接在当前标签页加载目标链接。 - 如果你需要在页面内的特定容器(比如iframe)打开链接,可以把
window.location.href换成对应的容器跳转逻辑,比如修改iframe的src属性。
内容的提问来源于stack exchange,提问作者Rohit Mane
相关产品推荐
相关产品推荐

