【问题标题】:How can I return a view from an AJAX call in Laravel 5?如何从 Laravel 5 中的 AJAX 调用返回视图?
【发布时间】:2015-04-22 11:17:19
【问题描述】:

我试图让一个 html 表返回一个 ajax 调用。

路线:

Route::post('job/userjobs', 'JobController@userjobs');  

调用页面上的ajax:

function getUserJobs(userid) {
    $_token = "{{ csrf_token() }}";
    var userid = userid;
    $.ajax({
        headers: { 'X-CSRF-Token' : $('meta[name=_token]').attr('content') },
        url: "{{ url('/job/userjobs') }}",
        type: 'POST',
        cache: false,
        data: { 'userid': userid, '_token': $_token }, //see the $_token
        datatype: 'html',
        beforeSend: function() {
            //something before send
        },
        success: function(data) {
            console.log('success');
            console.log(data);
            //success
            //var data = $.parseJSON(data);
            if(data.success == true) {
              //user_jobs div defined on page
              $('#user_jobs').html(data.html);
            } else {
              $('#user_jobs').html(data.html + '{{ $user->username }}');
            }
        },
        error: function(xhr,textStatus,thrownError) {
            alert(xhr + "\n" + textStatus + "\n" + thrownError);
        }
    });
}



//on page load
getUserJobs("{{ $user->id }}");

控制器:

public function userjobs() {
    $input = Request::all();
    if(Request::isMethod('post') && Request::ajax()) {
        if($input['userid']) {
            $userjobs = Userjob::select('select * from user_jobs where user_id = ?', array($input['userid']));
            if(! $userjobs) {
                return response()->json( array('success' => false, 'html'=>'No Jobs assigned to ') );
            }
            $returnHTML = view('job.userjobs')->with('userjobs', $userjobs);
            return response()->json( array('success' => true, 'html'=>$returnHTML) );

        }
    }   
}

查看:

@section('content')
<table class="table table-striped">
    <tbody>
@foreach ($userjobs as $userjob)
        <tr>
            <td><strong>{{ $userjob->title }}</strong><br />
            {{ $userjob->description }}
            </td>
        </tr>
@endforeach
</table>
@stop

我在 json.html 数据中没有得到任何东西。没有。如果在控制器中我说:

return response()->json( array('success' => true, 'html'=>'<span>html here</html>') );

这很好用。

如何从 Laravel 5 中的 ajax 调用返回视图。

【问题讨论】:

    标签: javascript php jquery ajax laravel


    【解决方案1】:

    view() 函数只是创建了View 类的一个实例。不仅仅是一个 HTML 字符串。为此,您应该致电render()

    $returnHTML = view('job.userjobs')->with('userjobs', $userjobs)->render();
    return response()->json(array('success' => true, 'html'=>$returnHTML));
    

    【讨论】:

    • ok - 将 ->render() 添加到上述视图中。但我仍然没有在输出中得到任何 html。这是控制台输出:Object {success: true, html: ""}。还有什么想法吗?
    • 如果我这样做 return response()-&gt;json(array('success' =&gt; true, 'html'=&gt;'&lt;div&gt;hello&lt;/div&gt;')); 它会输出预期的结果。
    • 嗯,我也无法正常工作...似乎调用render() 会自动输出内容,而不仅仅是将其作为字符串返回。这在 Laravel 4 中有所不同,我不确定这是功能还是错误。
    • 现在我在全新安装上尝试了它,它工作得非常好。也许尝试更新 Laravel (composer update)
    • composer update 没有解决问题。我正在运行 laravel/framework (v5.0.6)
    【解决方案2】:

    删除这个 if 条件,看看它是否有效

    if(Request::isMethod('post') && Request::ajax()) {
    

    【讨论】:

      【解决方案3】:

      好的 - 我通过反复试验发现您没有在视图文件中包含刀片模板命令以使其正常工作。

      我有:

      @section('content')
      <table class="table table-striped">
          <tbody>
      @foreach ($userjobs as $userjob)
              <tr>
                  <td><strong>{{ $userjob->title }}</strong><br />
                  {{ $userjob->description }}
                  </td>
              </tr>
      @endforeach
      </table>
      @stop
      

      现在它正在使用:

      <table class="table table-striped">
          <tbody>
          <?php foreach ($userjobs as $userjob){?>
              <tr>
                  <td><strong><?php echo $userjob->title; ?></strong><br />
                  <?php echo $userjob->description; ?>
                  </td>
              </tr>
          <?php } ?>
      </table>
      

      尽管我搜索过 - 我从未找到说明这一点的文档。

      【讨论】:

        【解决方案4】:

        在查看文件名前使用字符串函数,如 as

        return (String) view('Company.allUserAjax');
        

        【讨论】:

          【解决方案5】:

          如果您的 ajax 是正确的并且您正在从数据库中获得结果

           $returnHTML = view('job.userjobs',[' userjobs'=> $userjobs])->render();// or method that you prefere to return data + RENDER is the key here
                      return response()->json( array('success' => true, 'html'=>$returnHTML) );
          

          【讨论】:

          • 感谢这个解决方案对我有用。你拯救了我的一天。非常感谢
          • @SanjaySharma 非常欢迎您。渲染方法不止一次救了我!
          【解决方案6】:

          idk,如果您仍在寻找答案,但我遇到了与您相同的问题,它一直返回空白。成功的关键是在局部视图中删除 @section @endsection 部分

          【讨论】:

            【解决方案7】:
            $returnHTML = view('job.userjobs')->with('userjobs', $userjobs)->renderSections()['content'];
            

            所以这个问题很老,最受好评的答案并没有解决提问者和我的问题。我遇到了同样的问题,我花了两天时间才找到解决方案。我到处寻找使用-&gt;render()的答案。但什么也没回来。我有一个我想包括在内的部分观点。我没有扩展我的局部视图或给它一个部分名称。因为在使用 include 指令将其包含在刀片文件中时,这不是必需的。

            所以解决方案是,将您的 html 包含在一个部分中,而不是 render(),使用 renderSections()['sectionname']。仅仅使用render() 是行不通的。

            我希望这会给某人一些时间和挫折感!

            【讨论】:

              【解决方案8】:

              不要将视图返回为 JSON,只需从控制器返回视图 例如:

              $view = view("<your url>",compact('data'))->render();
              return $view;
              

              这肯定会奏效。

              【讨论】:

                【解决方案9】:

                这对我有帮助:

                echo view('ajaxView')->with(['value' => 'some value']);
                

                我使用 echo view('ajaxView') 代替 return view('ajaxView')。

                【讨论】:

                  【解决方案10】:

                  没有这些我也能正常工作:@section & @stop

                  <table class="table table-striped">
                      <tbody>
                  @foreach ($userjobs as $userjob)
                          <tr>
                              <td><strong>{{ $userjob->title }}</strong><br />
                              {{ $userjob->description }}
                              </td>
                          </tr>
                  @endforeach
                  </table>
                  

                  任何一个

                  $returnHTML = view('job.userjobs',[' userjobs'=> $userjobs])->render();// or method that you prefere to return data + RENDER is the key here
                  

                  或者这个

                  $returnHTML = view('job.userjobs',compact($userjobs))->render();// or method that you prefere to return data + RENDER is the key here`
                  

                  两者都有效

                  【讨论】:

                    【解决方案11】:
                    $view = view("job.userjobs",compact($userjobs))->render();
                    return response()->json(['html'=>$view]);
                    

                    【讨论】:

                      【解决方案12】:

                      如果你在 Laravel 中使用 AJAX,那么当你想显示带有 AJAX 响应的视图时,不要使用 return 命令,而是使用 echo 命令。

                      例如,不要使用:

                      return view('ajax', ['ajax_response'=> $response]);
                      

                      使用:

                      echo view('ajax', ['ajax_response'=> $response]);
                      

                      其他示例,请勿使用:

                      $view = view("job.userjobs",compact($userjobs))->render();
                      return response()->json(['html'=>$view]);
                      

                      使用:

                      $view = view("job.userjobs",compact($userjobs))->render();
                      echo response()->json(['html'=>$view]);
                      

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 2023-03-28
                        • 2020-01-06
                        • 2020-07-21
                        • 2020-11-24
                        • 2017-10-28
                        • 1970-01-01
                        • 1970-01-01
                        • 2013-11-10
                        相关资源
                        最近更新 更多