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

Laravel中AJAX提交序列化表单时PUT方法失效问题求助

问题解决:Laravel AJAX表单验证405错误与语法错误

核心问题分析

  1. 405 Method Not Allowed错误:
    表单中的@method('PUT')会生成一个隐藏的input字段(name="_method" value="PUT"),当你用serialize()提交表单数据时,这个参数会被一并发送。Laravel会根据_method参数将POST请求解析为PUT请求,但你的验证路由users.validate仅支持POST方法,因此触发405错误。

  2. 语法错误:
    你尝试修改data参数时的写法{$('#create-user-form').serialize(), '_method':'PUT'}不符合JavaScript对象语法,对象必须以key: value的键值对形式定义,直接放置字符串会导致语法报错。


解决方案

方法1:移除序列化数据中的_method参数(适合无文件上传的场景)

直接在序列化后去掉_method=PUT参数,让AJAX请求以纯POST方式发送到验证路由:

$(function(){
    $(document).on('click', '#userupdate', function(e){
        e.preventDefault();
        $.ajaxSetup({
            headers: { 'X-CSRF-TOKEN': "{{ csrf_token() }}" }
        });
        $.ajax({
            method: "POST",
            url: "{{ route('users.validate') }}",
            // 移除序列化数据中的_method参数
            data: $('#create-user-form').serialize().replace('_method=PUT&', '').replace('_method=PUT', ''),
            dataType: 'json',
            success: function(data){
                if(data.success)
                {
                    $('#create-user-form').submit();
                }
            },
            error: function(err){
                console.log(err);
            }
        });
    });
});

方法2:使用FormData处理(适合含文件上传的场景)

由于你的表单设置了enctype="multipart/form-data",如果存在文件上传字段,serialize()无法正确处理文件数据,此时推荐使用FormData,并手动删除_method参数:

$(function(){
    $(document).on('click', '#userupdate', function(e){
        e.preventDefault();
        $.ajaxSetup({
            headers: { 'X-CSRF-TOKEN': "{{ csrf_token() }}" }
        });
        // 创建FormData对象,包含表单所有数据
        var formData = new FormData($('#create-user-form')[0]);
        // 移除PUT方法标识
        formData.delete('_method');
        
        $.ajax({
            method: "POST",
            url: "{{ route('users.validate') }}",
            data: formData,
            dataType: 'json',
            processData: false, // 禁止jQuery处理FormData
            contentType: false, // 让浏览器自动设置正确的Content-Type
            success: function(data){
                if(data.success)
                {
                    $('#create-user-form').submit();
                }
            },
            error: function(err){
                console.log(err);
            }
        });
    });
});

方法3:覆盖_method参数为POST

另一种思路是直接将_method参数的值改为POST,让Laravel识别为POST请求:

data: $('#create-user-form').serialize() + '&_method=POST',

内容的提问来源于stack exchange,提问作者Sambhu M R

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 10:40:35