繁体   English   中英

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

[英]Laravel 5.2 - Return view from controller after ajax request

我有一个javascript函数,它向控制器发送一些信息(通常是数组和ID之类的vars)以插入表中,问题是插入完成后,我想返回到具有数据数组的其他视图,我无法似乎这样做(我认为是因为ajax请求)

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) {
                window.location.replace(data.url);
            }
        });
    }); // end form.submit

函数准备PostData()

 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调用控制器用于在后台提供一些数据,而标准控制器用于控制视图,因此最佳实践是将Ajax控制器的数据(JSON)返回到请求数据的同一视图。 而应该使用标准控制器来控制视图。

解决了

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

控制者

   $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');

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM