【问题标题】:Sending data to a controller with ajax in laravel在 laravel 中使用 ajax 向控制器发送数据
【发布时间】:2016-09-18 06:50:12
【问题描述】:

我正在尝试将简单的 POST 请求数据发送到控制器,但使用 ajax。没什么特别的,我只是想在不重定向/刷新页面的情况下将数据发送到我的控制器。

编辑:将所有代码更新为当前状态

在标题中

<meta name="csrf-token" content="{{ csrf_token() }}" />
<script>var host="{{url()}}"</script>

路线

post('/messages/unread', '\CommendMe\Http\Controllers\MessageController@getReadRequest');

标记

<div class="accordion messageAccordion getRequestReadMessage" data-value="{{$message->id}}">

脚本

$('.getRequestReadMessage').click(function() {
    $readValue = $(this).attr('data-value');
    $token     = $('meta[name=csrf-token]').attr("content");
        $.ajax({
        type: "POST",
        url: host + '/messages/unread',
        data: {readValue: $readValue, _token:$token},
    });
});

控制器

public function getReadRequest(Request $request)
{
    dd(Input::get("readValue"));
}

【问题讨论】:

    标签: ajax laravel


    【解决方案1】:

    Ajax 部分本身看起来还不错。 确保您在代码中的某处定义了host。例如:

    <head><script>var host="{{url()}}"</script>
    

    但是,如果您在&lt;a href 上收听click,最好防止事件冒泡。像这样:

    $('.getRequestReadMessage').click(function(e) {
       e.preventDefault();
    

    对于 Laravel Controller 的方法,有多种方式。 例如:

    dd(Input::get("readValue"));
    dd(Request::get("readValue"));
    dd($request->input("readValue");
    

    两者都可以解决问题

    路线很可能也关闭了,路径需要“未读”才能工作。

    post('/messages/unread', '\CommendMe\Http\Controllers\MessageController@getReadRequest');
    

    【讨论】:

    • 如果使用 Laravel 5 你也可以这样做request()-&gt;input('readValue')
    • 我可能想指定当我单击“.getRequestReadMessage”时,控制台中出现错误“ReferenceError: host is not defined”。
    • 这样做:&lt;head&gt;&lt;script&gt;var host="{{url()}}"&lt;/script&gt;,这样您就应该在全球所有 JS 中看到对您网站的引用
    • 好的,错误消失了。现在,当我单击它时,什么也没有发生。
    • 在 firebug/chrometools 中检查请求是否到达您的服务器。如果是这样,请检查返回正文。如果通过了,你应该得到dd的结果,否则,错误信息。
    【解决方案2】:

    由于您使用的是 POST 方法,因此您必须向其发送 _token,您可能会收到令牌不匹配错误。

    在你的标题上,写上这个:

    <meta name="csrf-token" content="{{ csrf_token() }}" />
    

    在 JS 上

    $('.getRequestReadMessage').click(function() {
        $readValue = $(this).attr('data-value');
        $token     = $('meta[name=csrf-token]').attr("content");
            $.ajax({
            type: "POST",
            url: host + 'messages/unread',
            data: {readValue: $readValue, _token:$token},
        });
    });
    

    不过,您的路线似乎有点偏离。 将其更新为: post('/messages/unread', '\CommendMe\Http\Controllers\MessageController@getReadRequest');

    ====编辑=====

    另外,我看到您在表单字段周围有那个 div,因为您使用的是 ajax,所以没有必要。

    <div class="accordion messageAccordion getRequestReadMessage" data-value="{{$message->id}}">
    

    我所做的是删除表单字段和隐藏输入,我还删除了 type=submit 属性,因为它不是表单中的按钮。我将 div 中的 value 属性更改为 data-value。把你的 JS 改成这样:

    $readValue = $(this).attr('data-value');
    

    编辑 2

    $('.getRequestReadMessage').click(function() {
        $readValue = $(this).attr('data-value');
        $token     = $('meta[name=csrf-token]').attr("content");
        $.ajax({
            type: "POST",
            url: host + '/messages/unread',
            data: {readValue: $readValue, _token:$token},
        }).success(function (res){
            alert('it work! :D');
        });
    });
    

    【讨论】:

    • 你是在 JS 文件中定义了变量 host 还是在任何地方都定义了它?
    • 我更新了我的答案,看看是否有帮助:) @FelixMaxime
    • 200 不是错误,这意味着没问题,在 chrome 中进行 onpen 检查,或在 mozilla 上使用 firebug,刷新页面,单击进行 ajax 调用的按钮,然后查看它显示的内容您的网络选项卡,它应该吐出 readValue 的值
    • 您是否在 .ENV 文件中设置了用户名和密码? DB_HOST=localhost DB_DATABASE=my_database_name DB_USERNAME=root DB_PASSWORD=password_if_db_has_password
    • 你的数据库名称呢? forge 是 laravel 附带的默认数据库名称,还请检查我的 ajax 调用更新
    【解决方案3】:

    尝试调整您的路线:

    Route::post('/messages/unread', '\CommendMe\Http\Controllers\MessageController@getReadRequest');
    

    【讨论】:

      猜你喜欢
      • 2017-04-29
      • 2015-04-16
      • 2015-11-22
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 2016-08-02
      • 2019-01-06
      • 1970-01-01
      相关资源
      最近更新 更多