CodeIgniter 4按钮变量传递至控制器为空问题排查
排查CodeIgniter 4中AJAX传递变量为null的问题
你遇到的核心问题是点击a标签时默认跳转行为打断了AJAX请求,同时代码里还有几处语法/逻辑错误,导致控制器接收不到quotation值,以下是具体排查和修正方案:
1. 首要问题:未阻止a标签的默认跳转行为
点击.edita标签时,浏览器会优先执行其href属性的跳转,AJAX请求还没完成就被中断,导致控制器根本没收到POST的quotation数据,自然输出null。
修正AJAX代码:
添加e.preventDefault()阻止默认跳转,同时修正回调函数的错误写法:
$(document).on('click', '.edit', function(e) { // 阻止a标签的默认跳转行为 e.preventDefault(); var quotation = $(this).attr('data-quotation'); // 获取a标签的原跳转地址 var targetUrl = $(this).attr('href'); $.ajax({ type: 'POST', dataType: 'json', url: baseurl + 'purchase/senddata/' + quotation, data: { 'quotation': quotation }, success: function(data) { // 确保AJAX请求完成后再跳转 window.location = targetUrl; } }); });
2. 控制器代码的优化与修正
你的路由已经把URL中的(:segment)传递给了edit_data方法的$id参数,这个值就是你要的quotation,完全可以直接使用,不需要再通过getVar获取POST数据(当然如果要保留POST传递也可以,但没必要重复传):
修正控制器代码:
public function edit_data($id_quotation) { // 直接使用路由传递的$id_quotation,无需再获取POST参数 $data = [ 'title' => 'Edit Purchase Order', // 补充:原逻辑中`getPurchase`需要的purchase id,可通过AJAX额外传递 'invoice' => $this->purchases->getPurchase($this->request->getVar('purchaseId')), 'dataQuotation' => $this->purchases->getQuotationById($id_quotation) ]; dd($id_quotation); return view('purchase-order/edit-data', $data); }
3. 补充:HTML标签的优化
把purchase的id也存入data属性,方便AJAX传递完整参数:
<a class="dropdown-item edit" href="<?= base_url("/purchase/edit/{$row->id}") ?>" data-quotation="<?= $row->id_quotation ?>" data-purchase-id="<?= $row->id ?>">Edit</a>
对应的AJAX中添加purchaseId参数:
data: { 'quotation': quotation, 'purchaseId': $(this).data('purchase-id') },
这样控制器就能正确获取到purchase的id,用于查询invoice数据。
内容的提问来源于stack exchange,提问作者Andrue
相关产品推荐
相关产品推荐

