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
相关产品推荐
相关产品推荐

