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

Visualforce页面更新数据报MISSING_ARGUMENT错误,请求修正代码

解决Visualforce更新数据时的MISSING_ARGUMENT错误

错误原因

Update failed. First exception on row 0; first error: MISSING_ARGUMENT, Id not specified in an update call: [] 这个错误的核心是:执行update操作时,目标Contract记录没有携带有效Id值。Salesforce的DML更新操作必须通过Id定位要修改的现有记录,缺少Id会导致系统无法识别目标,从而抛出该错误。

修正方案

1. 修正Apex控制器,确保加载带Id的现有记录

在ContractController中,需要先通过页面参数获取要编辑的Contract Id,从数据库加载对应记录,确保记录对象包含有效Id后再执行更新:

public class ContractController {
    public Contract currentContract { get; set; }

    // 初始化控制器,获取并加载要编辑的合同记录
    public ContractController() {
        String contractId = ApexPages.currentPage().getParameters().get('id');
        if (String.isNotBlank(contractId)) {
            // 从数据库查询现有记录,确保携带Id
            currentContract = [SELECT Id, Name, StartDate, EndDate, /* 其他需要编辑的字段 */ FROM Contract WHERE Id = :contractId LIMIT 1];
        } else {
            ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.ERROR, '未指定要编辑的合同Id'));
            currentContract = new Contract();
        }
    }

    public PageReference edit() {
        try {
            // 检查记录Id是否有效,避免无意义的DML调用
            if (currentContract.Id != null) {
                update currentContract;
                ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.CONFIRM, '合同更新成功'));
            } else {
                ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.ERROR, '无法更新:未找到有效合同Id'));
            }
            return null;
        } catch (DmlException e) {
            ApexPages.addMessages(e);
            return null;
        }
    }
}

2. 调整Visualforce页面,确保绑定记录并传递Id

页面中需要绑定控制器加载的现有记录,同时通过隐藏字段保留Id,并且访问页面时URL需携带目标Contract的Id参数:

<apex:page controller="ContractController">
    <apex:messages />
    <apex:form>
        <apex:pageBlock title="编辑合同">
            <!-- 隐藏字段保留记录Id,确保更新时能传递给控制器 -->
            <apex:inputHidden value="{!currentContract.Id}" />
            <apex:pageBlockSection columns="2">
                <apex:inputField value="{!currentContract.Name}" />
                <apex:inputField value="{!currentContract.StartDate}" />
                <apex:inputField value="{!currentContract.EndDate}" />
                <!-- 添加其他需要编辑的字段 -->
            </apex:pageBlockSection>
            <apex:pageBlockButtons>
                <apex:commandButton action="{!edit}" value="保存修改" />
            </apex:pageBlockButtons>
        </apex:pageBlock>
    </apex:form>
</apex:page>

关键验证点

  • 访问Visualforce页面时,URL必须包含id参数,示例:/apex/你的页面名称?id=08aXXXXXXXXXXXXXXX(替换为实际的Contract Id)
  • 控制器中必须通过ApexPages.currentPage().getParameters().get('id')获取Id,不能直接新建Contract对象用于编辑更新
  • 执行update前务必检查记录Id是否非空,避免无效DML操作

内容的提问来源于stack exchange,提问作者srinu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 23:15:44