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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 21:13:22