本文介绍如何在 dynamics 365 模型驱动应用中,通过自定义 html/javascript 弹窗(web resource)收集用户输入,并将选项集(option set)等字段值回传至主表单,替代简单提示框,提升数据录入效率与用户体验。
本文介绍如何在 dynamics 365 模型驱动应用中,通过自定义 html/javascript 弹窗(web resource)收集用户输入,并将选项集(option set)等字段值回传至主表单,替代简单提示框,提升数据录入效率与用户体验。
在 Dynamics 365 中,当业务流程要求用户在提交前必须填写某关键字段(如“赢取原因”“解决状态”等选项集字段)时,仅用 alert() 或 Xrm.Navigation.openAlertDialog() 提示用户“请填写字段”往往体验较差——它无法直接编辑,也无法自动同步值。更规范、可扩展的方案是:使用自定义 Web Resource 构建轻量级弹窗表单,支持字段编辑与双向数据回传。
Dynamics 365 官方推荐且唯一支持模态交互的客户端 API 是 Xrm.Navigation.openWebResource。它可在当前页面上下文中打开一个 HTML 页面(即 Web Resource),并支持通过 window.parent 或 Xrm.Utility.getGlobalContext() 进行安全通信。
<!-- Web Resource 名称: new_/popup_fill_reason.html --><!DOCTYPE html><html><head> <title>请选择赢取原因</title> <style> body { font-family: 'Segoe UI', sans-serif; padding: 20px; } select, button { padding: 8px; margin: 5px; } </style></head><body> <label for="reasonSelect">赢取原因:</label> <select id="reasonSelect"> <option value="">-- 请选择 --</option> <option value="1">战略契合</option> <option value="2">价格优势</option> <option value="3">服务响应快</option> </select> <br> <button onclick="submitAndClose()">确定</button> <button onclick="window.close()">取消</button> <script> function submitAndClose() { const selectedValue = document.getElementById('reasonSelect').value; if (!selectedValue) return; // ✅ 安全回写至主表单字段(假设字段逻辑名为 'new_wonreason') try { // 获取父页面 Xrm 对象(需确保跨域同源,且 Web Resource 已发布) const parentXrm = window.parent.Xrm; if (parentXrm && parentXrm.Page) { parentXrm.Page.getAttribute('new_wonreason')?.setValue(parseInt(selectedValue)); // 可选:触发字段变更事件或自动保存 parentXrm.Page.data.refresh(false); } } catch (e) { console.error("回写字段失败:", e); } window.close(); } </script></body></html>
若该弹窗本质是业务流程必填环节(如“标记为赢取”),强烈建议采用原生平台机制:
综上,openWebResource 是实现自定义弹窗编辑的可行技术路径,但务必结合业务语义权衡——优先使用平台原生能力,再以 Web Resource 做精细化补充。