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

Laravel中如何通过AJAX向控制器传递对象?AJAX提交更新数据时控制器无法获取数据的问题求助

我来帮你排查下问题,看起来主要有几个地方出错了,咱们一步步解决:

问题1:AJAX数据传递格式错误

你现在把序列化后的表单数据包裹在formdata这个键里,导致控制器收到的是一个包含整个序列化字符串的单一字段,而不是解析好的表单键值对。比如实际发送的是formdata=fname=xxx&lname=yyy&...,而非直接把这些键值对作为POST参数传递。

修正方案(二选一)

方案一:直接发送序列化字符串(推荐,适合普通表单)

首先把表单里注释掉的CSRF令牌打开(Laravel必须验证CSRF):

<form id="productForm" name="productForm" class="form-horizontal">
    @csrf <!-- 取消注释这行 -->
    <!-- 其他表单元素保持不变 -->
</form>

然后修改AJAX代码,直接传递序列化后的表单数据:

$('body').on('click', '.edit_form', function (e) {
    e.preventDefault();
    var formdata = $('#productForm').serialize();
    $.ajax({
        url: "{{url('store')}}",
        type: "POST",
        data: formdata, // 直接发送序列化后的字符串,包含CSRF令牌
        dataType: 'json',
        success: function (data) {
            console.log("请求成功:", data);
        },
        error: function (xhr) {
            console.log("请求失败:", xhr.responseText);
        }
    })
});

方案二:用FormData对象(适合需要上传文件的场景)

如果以后表单可能包含文件上传,推荐用FormData:

$('body').on('click', '.edit_form', function (e) {
    e.preventDefault();
    var formData = new FormData($('#productForm')[0]);
    $.ajax({
        url: "{{url('store')}}",
        type: "POST",
        data: formData,
        contentType: false, // 必须设置,让浏览器自动处理请求头
        processData: false, // 必须设置,禁止jQuery处理数据格式
        dataType: 'json',
        success: function (data) {
            console.log("请求成功:", data);
        },
        error: function (xhr) {
            console.log("请求失败:", xhr.responseText);
        }
    })
});

问题2:控制器字段名匹配错误

你的表单里第一个名字字段是name="fname",但控制器里写的是$request->get('first_name')——字段名完全不匹配,肯定拿不到数据!要改成对应表单的name属性:

public function userStore(Request $request) {
    // 先返回所有请求数据,方便调试
    return response()->json($request->all());
    
    // 后续业务逻辑可以这样获取字段
    // $fname = $request->fname;
    // $lname = $request->lname;
    // $email = $request->email;
}

问题3:dd()导致前端显示异常

因为AJAX请求预期接收JSON数据,你用dd()会输出HTML格式的调试内容,前端无法解析,就会出现你看到的那段Sfdump代码。要查看请求数据,必须用return response()->json($request->all()),这样前端会收到标准JSON,在浏览器控制台就能正常查看。

额外检查点

  1. 打开浏览器开发者工具(F12),切换到Network标签,查看POST请求的Form Data,确认所有字段和CSRF令牌都正确发送;
  2. 确保路由Route::post('store', 'UserController@userStore');没有被其他路由覆盖或冲突。

按上面的步骤修改后,控制器应该就能正常接收到表单数据了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 11:22:56