Laravel中Ajax提交数据时变量未定义问题求助
问题分析与修复方案
核心问题:控制器未从请求中获取表单字段
你遇到的undefined错误根源在于控制器中直接使用了未定义的变量(比如$fname、$lname等),没有从Request对象中读取Ajax提交的表单数据。此外还有几处细节错误会导致前端响应异常。
修复步骤:
1. 修正控制器变量获取逻辑
将控制器中直接赋值的变量,全部改为从$request对象中获取。可以逐个字段赋值,或者使用批量赋值(更简洁):
方式一:逐个字段赋值(修改后的控制器代码)
public function save(Request $request) { // 完善验证规则,覆盖所有必填字段 $validator = \Validator::make($request->all(), [ 'cnic' => 'required|unique:patients', 'fname' => 'required', 'contactno' => 'required', 'gender' => 'required', // 其他必填字段按需添加 ]); if ($validator->fails()) { return response()->json(['success' => false, 'errors' => $validator->errors()->all()]); } $temppatientId = IdGenerator::generate(['table' => 'patients', 'length' => 5, 'prefix' => '22']); $patientid = $temppatientId + 1; // 模型名遵循Laravel约定,首字母大写(假设模型文件为Patient.php) $query = new Patient; $query->patientid = $patientid; // 从$request中读取对应字段值 $query->fname = $request->fname; $query->lname = $request->lname; $query->cnic = $request->cnic; $query->contactno = $request->contactno; $query->gender = $request->gender; $query->age = $request->age; $query->dob = $request->dob; $query->city = $request->city; $query->address = $request->address; $query->husbandname = $request->husbandname; $query->fathername = $request->fathername; $query->bloodgroup = $request->bloodgroup; $query->maritalstatus = $request->maritalstatus; $query->save(); // 保持返回键名和前端回调一致 return response()->json(['success' => true, 'patient' => $query]); }
方式二:批量赋值(更简洁,需在模型中设置$fillable)
在Patient模型中添加可填充字段:
class Patient extends Model { protected $fillable = [ 'patientid', 'fname', 'lname', 'cnic', 'contactno', 'gender', 'age', 'dob', 'city', 'address', 'husbandname', 'fathername', 'bloodgroup', 'maritalstatus' ]; }
然后控制器可以简化为:
public function save(Request $request) { $validator = \Validator::make($request->all(), [ 'cnic' => 'required|unique:patients', 'fname' => 'required', 'contactno' => 'required', 'gender' => 'required', ]); if ($validator->fails()) { return response()->json(['success' => false, 'errors' => $validator->errors()->all()]); } $temppatientId = IdGenerator::generate(['table' => 'patients', 'length' => 5, 'prefix' => '22']); // 合并patientid到请求数据中,批量创建 $patient = Patient::create(array_merge( $request->all(), ['patientid' => $temppatientId + 1] )); return response()->json(['success' => true, 'patient' => $patient]); }
2. 修正Ajax回调的键名错误
控制器返回的键名需要和前端回调保持一致,否则会出现undefined:
success: function(data) { if (data.success === false) { alert(data.errors.join('\n')); } else { $("#patientid").val(data.patient.patientid); } }
3. 阻止a标签的默认跳转行为
点击#save1这个a标签时,会触发默认页面跳转,导致Ajax请求中断。添加e.preventDefault()阻止默认行为:
$("#save1").on('click', function(e) { // 阻止a标签默认跳转 e.preventDefault(); // 后续验证和Ajax代码... });
4. 优化前端验证逻辑
利用你已经引入的Parsley.js做统一验证,替代分散的判断:
$("#save1").on('click', function(e) { e.preventDefault(); // 使用Parsley验证表单 if ($('#registrationform').parsley().isValid()) { $.ajax({ url: "/save", type: "post", data: $('#registrationform').serialize(), dataType: 'json', success: function(data) { if (data.success === false) { alert(data.errors.join('\n')); } else { $("#patientid").val(data.patient.patientid); } }, error: function(xhr) { alert('提交失败,请重试'); } }); } });
内容的提问来源于stack exchange,提问作者user19704437
相关产品推荐
相关产品推荐

