Visualforce自定义Lookup后ID传控制器为空问题求助
问题:自定义Lookup选中ID无法传递到Apex控制器(immediate=true场景)
问题场景
在Visualforce页面中用JavaScript覆盖原生Lookup实现自定义功能后,通过apex:actionSupport触发Apex控制器方法更新字段时,控制器始终获取不到选中的Lookup ID(solarDisclosure.Project__c为null)。因存在验证规则,必须设置immediate="true"才能触发方法,但该设置导致字段值无法传递到控制器。
现有代码
Visualforce部分
<apex:inputField id="ProjectLookup" tabOrderHint="1" value="{!solarDisclosure.Project__c}" required="true" html-read-only="true"> <apex:actionSupport event="onchange" action="{!updateFieldsBasedOnProject}" rerender="SolarDisclosureFields" immediate="true"/> </apex:inputField>
Apex控制器部分
public PageReference updateFieldsBasedOnProject(){ system.debug('solarDisclosure.Project__c: ' + solarDisclosure.Project__c); selectedProjectId = solarDisclosure.Project__c; system.debug('selectedProjectId: ' + selectedProjectId); Project__c selectedProject = [SELECT Id, Project_Location__c, Name FROM Project__c WHERE Id = :selectedProjectId]; solarDisclosure.Project_Location__c = selectedProject.Project_Location__c; solarDisclosure.Project_Name__c = selectedProject.Name; return null; }
原因分析
immediate="true"会跳过表单数据绑定阶段和验证规则执行,页面输入值无法同步到控制器的sObject属性(如solarDisclosure.Project__c),因此控制器始终拿到初始的null值。
解决方案:使用apex:param直接传递ID
通过在apex:actionSupport中添加apex:param,绕过immediate=true对数据绑定的限制,直接将页面上的Lookup值赋值给控制器变量。
修改后的代码
1. 调整Visualforce代码
添加apex:param将选中ID传递到控制器的selectedProjectId属性:
<apex:inputField id="ProjectLookup" tabOrderHint="1" value="{!solarDisclosure.Project__c}" required="true" html-read-only="true"> <apex:actionSupport event="onchange" action="{!updateFieldsBasedOnProject}" rerender="SolarDisclosureFields" immediate="true"> <!-- 直接传递页面Lookup值到控制器变量 --> <apex:param name="selectedProjectId" value="{!solarDisclosure.Project__c}" assignTo="{!selectedProjectId}"/> </apex:actionSupport> </apex:inputField>
2. 调整Apex控制器代码
声明公共的selectedProjectId属性,直接使用该变量查询数据,同时手动同步solarDisclosure.Project__c的值:
// 声明接收参数的公共属性 public Id selectedProjectId { get; set; } public PageReference updateFieldsBasedOnProject(){ system.debug('selectedProjectId: ' + selectedProjectId); // 空值判断,避免查询报错 if(selectedProjectId == null){ return null; } // 根据传递的ID查询项目信息 Project__c selectedProject = [SELECT Id, Project_Location__c, Name FROM Project__c WHERE Id = :selectedProjectId]; // 更新关联字段 solarDisclosure.Project_Location__c = selectedProject.Project_Location__c; solarDisclosure.Project_Name__c = selectedProject.Name; // 手动同步Lookup字段值(因immediate跳过了自动绑定) solarDisclosure.Project__c = selectedProjectId; return null; }
关键说明
apex:param的assignTo属性在请求处理早期执行,不受immediate=true影响,能正确传递页面选中的ID。- 需确保自定义Lookup的JavaScript代码正确更新了
apex:inputField的value属性,否则{!solarDisclosure.Project__c}无法获取选中ID。
内容的提问来源于stack exchange,提问作者almusavi
相关产品推荐
相关产品推荐

