将JavaScript数组传递至CodeIgniter控制器问题求助
解决方案:通过表单提交传递JSON到CodeIgniter(支持页面刷新)
Hola Franco! 看到你遇到的问题了——一开始用AJAX传数据没成功,后来又发现其实需要提交后刷新页面,AJAX反而不适用对吧?咱们一步步来解决:
首先分析你原来AJAX方案的问题
你之前的AJAX代码里,直接把JSON字符串aux作为data传递,但没有给它指定对应的键名,所以CodeIgniter控制器里$this->input->post('aux')根本找不到这个参数~而且AJAX本身是异步无刷新的,和你“提交后刷新页面”的需求冲突,所以咱们换更合适的表单提交方式。
正确的实现方案(表单+隐藏字段)
因为要提交后刷新页面,直接利用表单的默认提交行为,把JSON数据放到隐藏输入框里传递就可以了:
1. 修改视图代码,添加隐藏字段
在form_open之后,添加一个用于存储JSON的隐藏输入框,名字设为aux(和控制器里要获取的键对应):
$id= array('id' => 'x' ); echo form_open("cursos/guardarmalla",$id); // 添加隐藏字段 echo form_hidden('aux', ''); ?> <div align="center"><?php echo form_submit('','Guardar Malla',"class=\"btn btn-success btn-lg\"");?></div> <?php echo form_close()?>
2. 调整JS的表单提交事件
去掉AJAX代码,改成在表单提交前把JSON字符串赋值给隐藏字段,然后让表单正常提交(不要阻止默认行为,这样页面就会刷新):
$(document).ready(function(){ $('#x').submit(function(){ var aux = JSON.stringify(actualizar); // 将JSON字符串存入隐藏字段 $(this).find('input[name="aux"]').val(aux); // 这里不用return false或e.preventDefault(),让表单正常提交刷新页面 }); })
3. 控制器代码调整(确保能正确接收解析)
你的控制器代码基本没问题,不过可以加上判断,并且处理完数据后跳转或加载视图(因为刷新后通常要回到某个页面):
function guardarmalla(){ $datos= $this->input->post('aux'); if($datos){ $deco=json_decode($datos,true); // 这里可以做你需要的业务处理,比如存入数据库 // 处理完后跳转到目标页面(比如课程列表页) redirect('cursos/lista'); // 如果需要显示结果,也可以加载视图: // $data['recibidos'] = $deco; // $this->load->view('cursos/resultado', $data); } else { echo "No se recibieron datos válidos"; } }
额外:原来AJAX方案的修复(如果以后需要无刷新场景)
如果之后你又需要无刷新传递数据,只需要把AJAX的data改成键值对形式,给JSON字符串指定键名:
$.ajax({ type :'POST', url: $(this).attr("action"), dataType: "json", data : { aux: aux } // 把JSON字符串放到aux键下 });
这样控制器就能通过$this->input->post('aux')拿到数据了~
最后提醒一下:确保actualizar全局对象在表单提交时已经正确填充了数据,你可以在submit事件里加console.log(aux)确认内容是否正确哦!
内容的提问来源于stack exchange,提问作者franco.pina
相关产品推荐
相关产品推荐

