我有一个javascript函数,它向控制器发送一些信息(主要是像数组和id这样的变量)要插入表中,问题是插入完成后我想返回一个带有数据数组的不同视图我似乎无法做到这一点(我认为这是因为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);
答案 0 :(得分:1)
您不应该从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);
}
答案 1 :(得分:0)
刚刚详细解释了之前的答案,Ajax调用控制器用于在幕后提供一些数据,标准控制器用于控制视图,因此最佳实践是将数据(JSON)从Ajax控制器返回到请求数据的同一视图。而标准控制器应该用来控制视图。
答案 2 :(得分:0)
<强>解决强>
不是最优雅的解决方案,但我所做的是将错误设置为会话变量,并在我需要的特定控制器中获取该会话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');
使用它之后,您可以销毁会话变量或保留它(取决于您是否需要)。