Oracle APEX中禁用页面项提交页面时值未提交问题
问题原因
这是HTML的原生行为:表单提交时,浏览器不会发送处于disabled状态的表单元素的值,和Oracle APEX本身无关。即使页面上选择列表的选中值视觉显示正常,只要元素标记为disabled,其值就不会被包含在提交的表单数据中,导致后端PL/SQL无法获取到该值。
解决方法
以下三种方案可确保禁用状态下的页面项值能被提交到服务器:
方案1:用readonly替代disabled(推荐)
readonly属性的元素用户无法编辑,但值会被正常提交。只需修改JavaScript逻辑,并添加CSS模拟禁用的视觉效果:
修改后的JavaScript代码:
$(document).ready(function(){ $('input[name="P2_ACTION"]').change(function(){ const $reissue = $('#P2_REISSUE'); if($(this).val() === "VR"){ $reissue.prop('readonly', false).removeClass('apex-disabled-style'); } else { $reissue.prop('readonly', true).addClass('apex-disabled-style'); } }); });
添加CSS样式(可在页面内联CSS或主题CSS中配置):
.apex-disabled-style { background-color: #eeeeee; cursor: not-allowed; opacity: 0.6; }
此方案无需修改后端PL/SQL逻辑,直接使用原页面项P2_REISSUE的值即可。
方案2:同步值到隐藏字段
保留原disabled逻辑,同时新增一个隐藏页面项同步选择列表的值,后端读取隐藏字段的值:
- 在APEX页面创建隐藏项
P2_REISSUE_HIDDEN,其数据类型、来源与P2_REISSUE保持一致。 - 修改JavaScript代码实现值同步:
$(document).ready(function(){ const $reissue = $('#P2_REISSUE'); const $hidden = $('#P2_REISSUE_HIDDEN'); // 初始化同步值 $hidden.val($reissue.val()); $('input[name="P2_ACTION"]').change(function(){ if($(this).val() === "VR"){ $reissue.prop('disabled', false); } else { $reissue.prop('disabled', true); } // 同步值到隐藏字段 $hidden.val($reissue.val()); }); // 监听选择列表值变化,实时同步 $reissue.change(function(){ $hidden.val($(this).val()); }); });
- 后端PL/SQL逻辑中,将原引用
:P2_REISSUE改为:P2_REISSUE_HIDDEN。
方案3:提交前临时启用元素
利用APEX的页面提交事件,在提交前临时启用禁用的元素,提交完成后恢复状态:
$(document).ready(function(){ const $action = $('input[name="P2_ACTION"]'); const $reissue = $('#P2_REISSUE'); $action.change(function(){ if($(this).val() === "VR"){ $reissue.prop('disabled', false); } else { $reissue.prop('disabled', true); } }); // 页面提交前临时启用元素 apex.event.subscribe("apexbeforepagesubmit", function(){ $reissue.prop('disabled', false); }); // 提交完成后恢复禁用状态(可选,根据页面交互需求) apex.event.subscribe("apexafterpagesubmit", function(){ if($action.filter(':checked').val() !== "VR"){ $reissue.prop('disabled', true); } }); });
此方案无需修改后端逻辑,提交时浏览器会发送原页面项的值。
内容的提问来源于stack exchange,提问作者Henriquez
相关产品推荐
相关产品推荐

