javascript - Ajax 请求不向控制器方法发送数据
问题描述
我是 laravel 8 和 ajax 的新手,我也在一个小组中工作。我有一个刀片视图来查看用户的数据,因为从这个视图中我希望可以在没有表单标签的情况下修改一些数据,所以我制作了一个 js 脚本来将要修改的新数据发送到一个控制器,但是这个数据永远不会到达控制器,因为我注意到 mysql db 和 profilo 视图没有更新,但是一些“调试”打印输出报告成功。
我哪里错了?提前致谢。
这是控制器
class ProfiloUtente extends Controller{
public function visualizzaProfiloUtente(Request $request)
{
$id_utente = $request->session()->get('LoggedUser');
$flag_attore = $request->session()->get('Attore');
$utente = null;
if ($flag_attore === Attore::CITTADINO_PRIVATO) {
$utente = CittadinoPrivato::getById($id_utente);
}
if ($flag_attore === Attore::DATORE_LAVORO) {
$utente = DatoreLavoro::getById($id_utente);
}
if ($flag_attore === Attore::MEDICO_MEDICINA_GENERALE) {
$utente = MedicoMG::getById($id_utente);
}
return view('profilo', compact('utente'));
}
public function modificaProfiloUtente(Request $request)
{
$id_utente = $request->session()->get('LoggedUser');
$flag_attore = $request->session()->get('Attore');
$this->validation($request);
$input = $this->generalInput($request);
try {
User::updateInfo($id_utente, $input['nuovo_codice_fiscale'], $input['nome'], $input['cognome'], $input['citta_residenza'],
$input['provincia_residenza'], $input['email'], $input['password']);
if ($flag_attore === Attore::CITTADINO_PRIVATO) {
CittadinoPrivato::updateCittadino($input['codice_fiscale_attuale'], $input['nuovo_codice_fiscale']);
}
elseif ($flag_attore === Attore::DATORE_LAVORO) {
$input['partita_iva'] = $request->input('iva');
$input['nome_azienda'] = $request->input('nome_azienda');
$input['citta_azienda'] = $request->input('citta_sede_aziendale');
$input['provincia_azienda'] = $request->input('provincia_sede_aziendale');
DatoreLavoro::updateDatore($input['codice_fiscale_attuale'], $input['nuovo_codice_fiscale'], $input['partita_iva'], $input['nome_azienda'], $input['citta_azienda'], $input['provincia_azienda']);
}
elseif ($flag_attore === Attore::MEDICO_MEDICINA_GENERALE) {
$input['partita_iva'] = $request->input('iva');
MedicoMG::updateMedico($input['codice_fiscale_attuale'], $input['nuovo_codice_fiscale'], $input['partita_iva']);
}
}
catch(QueryException $ex){
return back()->with('update-error', 'Errore, modifica non avvenuta.');
}
return redirect('/profilo');
}
/**
* Raggruppa le validazioni dei dati comuni
* @param Request $request
*/
private function validation(Request $request) {
$validation = $request->validate([
'cf' => 'required|min:16|max:16',
'nome' => 'required|max:30',
'cognome' => 'required|max:30',
'citta_residenza' => 'required|max:50',
'provincia_residenza' => 'required|max:50',
'email' => 'required|email',
'psw' => 'required|min:8|max:40'
]);
}
private function generalInput(Request $request)
{
$input = [];
$input['nuovo_codice_fiscale'] = $request->input('cf');
$input['codice_fiscale_attuale'] = $request->input('cf_attuale');
$input['nome'] = $request->input('nome');
$input['cognome'] = $request->input('cognome');
$input['citta_residenza'] = $request->input('citta_residenza');
$input['provincia_residenza'] = $request->input('provincia_residenza');
$input['email'] = $request->input('email');
$input['password'] = $request->input('psw');
return $input;
}
}
这是路线
Route::post('/modificaProfilo', [ProfiloUtente::class, 'modificaProfiloUtente'])->name('modifica.profilo');
这是刀片视图中 ajax 请求的脚本
var data = '<?php echo json_encode($utente) ?>';
data = JSON.parse(data);
getDataProfilePage(data); //get values to update
sendDataProfilePage(data,"{{route('modifica.profilo') }}","{{csrf_token()}}");
public/script/script.js 中的 sendDataProfilePage 函数
function sendDataProfilePage(data, url, csrfToken) {
var formData = new FormData();
formData.append("_token", csrfToken);
for (key in data) {
if (key == "codice_fiscale") {
formData.append("cf", data[key]);
formData.append("cf_attuale", data[key]);
} else if (key == "password") {
formData.append("psw", data[key]);
} else if (key == "partita_iva") {
formData.append("iva", data[key]);
} else {
formData.append(key, data[key])
}
}
for (var pair of formData.entries()) { //print for feedback
console.log(pair[0] + ', ' + pair[1]);
}
//send data
var request = new XMLHttpRequest();
request.open("POST", url);
request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
request.setRequestHeader("X-CSRF-TOKEN", csrfToken);
request.onreadystatechange = function() {
console.log("ready state " + request.readyState); //print for feedback
console.log("status " + request.status); //print for feedback
if (request.readyState === XMLHttpRequest.DONE) {
if (status === 0 || (status >= 200 && status < 400)) { //detect request succes
console.log("responseStatus " + request.status + " " + request.statusText); //print for feedback
} else {
console.log("responseStatus " + request.status + " " + request.statusText); //print for feedback
}
}
};
request.send(formData);
}
解决方案
发送一个 FormData 对象,其内容类型为 multipart/form-data 而不是 application/x-www-form-urlencoded。在您的代码中删除您设置内容类型标头的行,将自动设置正确的内容类型标头。
推荐阅读
- mysql - Mysql2::Error: 指定的键太长;对于只有 87 db 字段的表,最大密钥长度为 767 字节
- openshift - 重命名 okd 集群的主节点的最佳方法是什么?
- angular - 父级中相同形式的两个子组件 - Angular
- amazon-web-services - 创建数据数组时如何在我的 appsync 中修复此错误
- reactjs - Search Console 中的 Google Crawler 无法使用 Github Page 在 React 中找到路由
- ios - Swift Firestore 更新字段值
- c++ - 删除链表节点,C++ 函数不起作用
- java - 从openCV输出获取相机帧而不是cam的原始帧
- spring - 如何使用 HandlerMethodArgumentResolver 在 Spring WebFlux 中注入自定义方法参数?
- php - 如何使用 Laravel index.php 服务 Vue-CLI