Laravel中AJAX提交序列化表单时PUT方法失效问题求助
问题解决:Laravel AJAX表单验证405错误与语法错误
核心问题分析
405 Method Not Allowed错误:
表单中的@method('PUT')会生成一个隐藏的input字段(name="_method" value="PUT"),当你用serialize()提交表单数据时,这个参数会被一并发送。Laravel会根据_method参数将POST请求解析为PUT请求,但你的验证路由users.validate仅支持POST方法,因此触发405错误。语法错误:
你尝试修改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
相关产品推荐
相关产品推荐

