UCI环境下如何区分快速创建表单的打开来源(导航栏/查找字段新建按钮)
区分UCI环境下项目实体快速创建表单的打开来源(非Web客户端)
我整理了几个实用的方案,帮你在UCI(统一客户端界面)的非Web客户端(比如桌面客户端)里区分快速创建表单是从查找字段新建按钮还是导航栏新建按钮打开的:
方案1:通过系统自带关联参数自动判断
从查找字段的新建按钮打开快速创建表单时,系统会自动附加关联父记录的查询参数(比如relatedEntityId、relatedEntityType);而从导航栏新建按钮打开的表单不会携带这些参数。
你可以在项目实体的快速创建表单的OnLoad事件中添加以下脚本:
function checkQuickCreateSource(executionContext) { var formContext = executionContext.getFormContext(); var globalContext = Xrm.Utility.getGlobalContext(); // 检查是否存在关联实体参数 var relatedEntityId = globalContext.queryParameters.relatedEntityId; var relatedEntityType = globalContext.queryParameters.relatedEntityType; if (relatedEntityId && relatedEntityType) { // 来源是查找字段的新建按钮 console.log("快速创建表单来自查找字段新建按钮"); // 这里可以添加你的业务逻辑,比如隐藏/显示特定字段 } else { // 来源是导航栏的新建按钮 console.log("快速创建表单来自导航栏新建按钮"); } }
这个方法无需修改原生按钮,利用系统自带参数即可判断,兼容性很好。
方案2:自定义按钮附加专属标识
如果方案1的参数判断不够明确(比如某些场景下可能意外携带关联参数),你可以替换查找字段的原生新建按钮,手动添加自定义标识参数:
- 打开Power Apps解决方案,找到包含目标查找字段的表单,添加一个JavaScript Web资源。
- 编写脚本替换查找字段的新建按钮行为,调用
Xrm.Utility.openQuickCreate时附加自定义参数:
function customLookupNewButton(executionContext) { var formContext = executionContext.getFormContext(); // 打开项目实体的快速创建表单,附加source参数 Xrm.Utility.openQuickCreate("your_project_entity_name", null, { source: "lookup_new_button" }).then( function success(result) { // 创建成功后的逻辑 }, function error(error) { console.log(error.message); } ); }
- 将这个脚本绑定到查找字段的新建按钮上(替换原生的打开行为)。
- 在快速创建表单的OnLoad事件中读取这个参数:
function checkCustomSource(executionContext) { var globalContext = Xrm.Utility.getGlobalContext(); var source = globalContext.queryParameters.source; if (source === "lookup_new_button") { console.log("来源:查找字段新建按钮"); } else { console.log("来源:导航栏新建按钮"); } }
这个方法更加灵活,自定义标识不会和系统参数冲突,适合复杂业务场景。
方案3:通过关联实体数据判断
从查找字段打开的快速创建表单,本质是为了创建一条与当前父记录关联的项目记录,因此表单会自动关联父实体的数据。你可以在快速创建表单的OnLoad事件中检查是否存在关联的父实体:
function checkRelatedEntity(executionContext) { var formContext = executionContext.getFormContext(); // 获取关联的实体集合(这里替换为你的查找字段对应的关联关系名称) var relatedEntities = formContext.data.entity.getRelatedEntities("your_relationship_name"); if (relatedEntities && relatedEntities.length > 0) { console.log("来源:查找字段新建按钮"); } else { console.log("来源:导航栏新建按钮"); } }
这个方法依赖于实体间的关联关系,适合已经明确关联逻辑的场景。
以上三个方案都支持UCI的非Web客户端(比如Power Apps桌面客户端),因为它们都是基于统一的Dataverse客户端API实现的,你可以根据自己的业务需求选择最合适的方案。
内容的提问来源于stack exchange,提问作者Mounika




