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

onclick触发AJAX更新isdisabled字段报NotFoundHTTPException求助

问题原因及解决方案

核心错误点

  • 路由规则与实际请求不匹配:定义的路由为POST请求、无参数占位符,实际发起的是GET请求、URL末尾拼接了id参数,路由匹配失败直接抛出404错误
  • confirm判断逻辑缺失:用户点击取消后依然会发起AJAX请求
  • POST请求未携带CSRF令牌:Laravel默认校验POST请求的CSRF令牌,缺失会触发419错误(属于代码隐藏问题)
  • Controller逻辑冗余:更新非主键字段不需要开启IDENTITY_INSERT,updateOrCreate方法使用不当

修复步骤

1. 修改路由配置

添加id参数占位符,适配动态id传参:

Route::post('/MediaOrder/disable/{id}', 'MediaOrderController@disable')->name('media-order.disable');

2. 调整AJAX请求逻辑

修正请求方法、补充CSRF参数、增加confirm结果判断:

$('body').on('click', '.disableMediaOrder', function(){
    var id = $(this).data("id");
    // 拦截用户取消操作
    if(!confirm("Are you sure you want to disable this ?")){
        return;
    }
    $.ajax({
        // 直接拼接路径即可,避免外部JS无法解析Blade语法的问题
        url: "/MediaOrder/disable/" + id,
        method: "POST",
        data: {
            // 读取按钮上存储的csrf_token
            _token: $(this).attr('value')
        },
        success: function (data){
            tableMediaOrder.draw();
        },
        error: function (data) {
            console.log('Error:', data);
        }
    });
});

3. 优化Controller disable方法

移除冗余配置、修正更新逻辑:

public function disable(Request $request, $id)
{
    // 仅更新目标id的isdisabled字段,不需要操作IDENTITY_INSERT
    MediaOrder::where('id', $id)->update(['isdisabled' => 1]);

    if ($request->ajax()){
        return redirect_ajax_notification('media-order.index');
    }else{
        return redirect_ajax('media-order.index');
    }
}

可选优化点

  • 修正Disable按钮的data-original-title属性值,从Delete改为Disable,避免tooltip提示错误
  • 若AJAX逻辑写在Blade模板的<script>标签内,可将URL部分替换为{{ route('media-order.disable', ['id' => '']) }}/${id},适配路由地址变更场景

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 17:45:10