【问题标题】:AJAX function in Laravel not posting form data to controllerLaravel 中的 AJAX 函数未将表单数据发布到控制器
【发布时间】:2019-12-17 05:50:35
【问题描述】:

我在 Laravel 中有一个表单,用户可以在其中购买产品。我试图在不刷新页面的情况下动态实现这一点。我可以调用 AJAX 函数,但它没有将数据发布到控制器,我需要帮助。控制器中的所有内容都运行良好,只是没有发送数据。

这是 HTML 表单

<form class="buy-product-form" id="{{$product->id}}" action="/UoE/buy-product/{{$product->id}}" method="POST">
                                    {{csrf_field()}}
                                    <button class="pull-right btn btn-primary">BUY NOW</button>
                                </form>

这是我的 AJAX 函数

$(document).ready(function(){
            $('form.buy-product-form').on('submit', (function (e) {
                e.preventDefault();
                var product_id = $(this).closest("form").attr("id");
                $.ajax({
                    url: $(this).closest("form").attr('action'),
                    type: 'POST',
                    data: {'id': product_id},
                    dataType: 'JSON',
                    success: function () {
                        window.alert(url);
                    }
                });
            }));
        });

这是控制器中的前几行

 public function buyProduct($university_code, $product_id){
        $player = Player::where('user_id', Auth::user()->id)->first();
        $product = Product::where('id', $product_id)->first();
        $totalPrice = $product->quantity_available * $product->price; 

【问题讨论】:

  • 您是否在控制台或调试栏中获得任何输出?
  • 您是否在您的 ajax 文件中发送 csrf 令牌(例如在站点元数据中)?您表单中的 {{csrf_field()}} 不在您的控制器中的 ajax 帖子中,请参阅:laravel.com/docs/5.8/csrf#csrf-x-csrf-token
  • @jtwes 我现在也刚刚添加了元标记和 ajaxsetup 函数。不幸的是,这仍然行不通。
  • 嗯。你至少应该看到一些东西或得到一个错误。添加 error: function(response) {console.log(response) } 并成功将响应输出到控制台。
  • 我昨天确实收到了 Laravel 验证 CSRF 令牌错误,但我不记得是什么原因造成的,因为我的 ajax 函数甚至没有 URL 或任何内容。

标签: php jquery html ajax laravel


【解决方案1】:

您没有将请求对象传递给您的控制器,但您已声明它需要两个参数。 在路由中,您只需指定一个参数 ($product-&gt;id)。 根据我的猜测,控制器方法应该是这样的:(已编辑)

public function buyProduct(Request $request){
        $product_id=$request->id; //could also be $product_id=$request()->id;
    }

访问 Request $request 对象或 request() 帮助程序以获取发布到控制器的数据。

帖子网址:url: $(this).closest("form").attr('action') 已经转换为/UoE/buy-product/{{$product-&gt;id}},所以那里已经有product-&gt;id/product_id

我的建议是将您的路线更改为最类似帖子的路线/UoE/buy-product 并传递数据(product_id 和 csrf 令牌)

$(document).ready(function(){
            $('form.buy-product-form').on('submit', (function (e) {
                e.preventDefault();
                var product_id = $(this).closest("form").attr("id");

                //doesn't matter which csrf, they're all the same
                var csrf=document.querySelector("input[name='_token']").getAttribute('value'); 

                $.ajax({
                    url: `/UoE/buy-product',
                    type: 'POST',
                    data: {
                        'id': product_id,
                        '_token':csrf //pass CSRF
                    },
                    dataType: 'JSON',
                    success: function () {
                        window.alert(url);
                    }
                });
            }));
        });

【讨论】:

  • 我需要发送的只是product_id,然后控制器会为我处理所有事情。因此,如果 product_id 已经在 URL 操作中传递,那么我还需要使用 Request 对象吗?如果需要,里面有什么?
  • 由于您正在执行 POST 请求,我假设您要将数据“发布”到服务器。例如,获取.buy-product-form 形式的字段值并将其放入data:{} 请求正文中。由于您只需要 product_id,因此无需使用 request 对象。 (不过,我建议使用Route::post('/UoE/buy-product')),然后将product_id 放入data:{'id':product_id}。然后您将访问function (Request $request){ $product_id=$request-&gt;id; })——但这只是我的意见!哪种方式适合你哈哈
  • 好的,非常感谢,我现在可以使用它了。我现在正在尝试执行您所说的操作,我想从 URL 中删除 Product_id,并且只通过 AJAX 函数将其发送到控制器。但除非我把它放在 URL 中,否则它不会起作用。如果你明白我的意思,我只是想确保它不会被发送两次。
  • 非常欢迎您。我在上面编辑了我的答案以更简洁,也许这会有所帮助?祝你好运
  • 我绝对理解你想让我做什么。但是我的 IDE 说 /UoE/buy-product 是一个未解析的文件或目录,并且链接不起作用。即使我在我的 routes.php 文件中更改了它
【解决方案2】:

我刚刚经历了在 Laravel 中通过 AJAX 发布的令人头疼的问题。我有与你类似的代码,但它不起作用。我所做的一些更改:

&lt;form&gt; 标签没有动作。

<form id="contact-form" class="main-form">

&lt;button&gt;标签:

<button class="btn btn-primary submit-button" type="button">Submit</button>

AJAX 调用:

$(document).ready(function() 
{
    $(".submit-button").click(function(e){            
        form_data = $("form").serialize()
        $.ajax({
            url: "/contact",
            type: "POST",
            data: form_data,
            success: function(data) 
            {
                if ($.isEmptyObject(data.error))
                {
                    handleSuccess(data.success);
                }
                else
                {
                    handleError(data.error);
                }
            }
        });
    });
});

【讨论】:

    【解决方案3】:

    您的控制器操作需要 2 个参数 buyProduct($university_code, $product_id),但在表单操作中您只传递产品 ID。

    【讨论】:

    • $university_code 参数是多余的,实际上并没有在控制器中使用。我会删除它。
    【解决方案4】:

    您似乎无法提交表单,因为您的按钮不是提交按钮。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-31
    • 2019-08-06
    • 1970-01-01
    • 1970-01-01
    • 2017-04-28
    • 1970-01-01
    • 2017-03-11
    相关资源
    最近更新 更多