Laravel 5.2 - 在 ajax 请求后从控制器返回视图


Laravel 5.2 - Return view from controller after ajax request

我有一个javascript函数,它向控制器发送一些要插入到表中的信息(主要是数组和id等变量),问题是插入完成后我想返回带有数据数组的不同视图,但我似乎无法做到这一点(我认为这是因为ajax请求)

Javascript Code

  $('#importar').submit(function(e) {
       e.preventDefault();
           fdata=preparePostData();
        $.ajax({
            type:'POST',
            url:   $(this).prop('action'), // url, from form
            data:fdata,
            processData: false,
            contentType: false,
            success:function(data) {
                window.location.replace(data.url);
            }
        });
    }); // end form.submit

函数准备后数据()

 var file_data=$('input:file')[0].files;
        var postdata=new FormData();
        postdata.append('_token',token);
        postdata.append('startFrom',startFrom);
        postdata.append('idList',idList);
        postdata.append('nomeCampos',nomeCampos);
        postdata.append('posicaoCampos',posicaoCampos);
        postdata.append('file',file_data[0]);
        return postdata;

控制器预期代码完成所有插入和功能,最后

  $data = array('listNome' => $listName, 'contacts' => $contacts, 'errors' => $erro);
        return view("XPTO", $data);

您不应该从 ajax 调用返回视图,因为您会将视图处理的代码作为 ajax 回调的参数。将 ajax 调用视为对服务器的异步"幕后"调用,您可以在其中传递参数并获取一些其他参数

相反,您应该从控制器返回一个 JSON 响应,其中包含从 JS 调用路由所需的所有参数,并在success回调中对其进行解析。例如:

控制器

//here you should store all the parameters you need in your JS calback
$data = array('status' => 'ok', 'url' => $redirect_url ); 

.JS

success:function(data) 
{
    //data will contain the parameters you set in the controller, so you can use them to call the route
    if ( data.status == 'ok' )
         window.location.replace(data.url);
} 

只是详细阐述前面的答案,Ajax调用控制器用于在幕后提供一些数据,标准控制器用于控制视图,因此最佳实践是将数据(JSON)从Ajax控制器返回到请求数据的同一视图。

已解决

不是最优雅的解决方案,但我所做的是将带有错误的数组设置为会话变量,并在我需要的特定控制器中获取该会话变量。

控制器

   $request->session()->put('importErrors',$erro);
        $response = array('status' =>'success','url' => '/ListarContactos/'.$idList);
        return response()->json($response);

JavaScript

$('#importar').submit(function(e) {
       e.preventDefault();
           fdata=preparePostData();
        $.ajax({
            type:'POST',
            url:   $(this).prop('action'), // url, from form
            data:fdata,
            processData: false,
            contentType: false,
            success:function(data) {
                if(data.status=='success'){
                    window.location.replace(data.url);
                }
            }
        });
    }); // end form.submit

XPTOController

$errorArray= $request->session()->get('importErrors');

使用它后,您可以销毁会话变量或保留它(取决于您是否需要它)。