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

