Yii2:表单提交时无法传递多个参数的问题
解决Yii2中点击按钮提交表单并传递多参数的问题
嘿,我来帮你搞定这个Yii2表单提交传参的问题!先看你贴的代码,首先有个小语法问题——a标签的HTML结构没写完整,数组部分没闭合,而且当前的onclick只是单纯提交表单,根本没把id、name这些参数传递进去,这就是为什么你传参失败啦。
下面给你几种靠谱的解决方案,选适合你的来用:
方法1:用隐藏字段传递参数(推荐,符合表单提交规范)
这种方法是把要传递的参数放到表单的隐藏输入框里,点击按钮时先给隐藏框赋值,再提交表单。
第一步:修复并修改按钮代码
先把你的a标签代码修正,换成调用自定义JS函数的方式:
<a class="<?= $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary' ?>" onclick="submitFormWithParams('spin', 'create');" href="javascript:;"> <?= $model->isNewRecord ? 'Create' : 'Update' ?> </a>
第二步:添加JavaScript函数
在页面的<script>标签里写这个处理函数:
function submitFormWithParams(idVal, nameVal) { // 给表单里的隐藏字段赋值 document.getElementById('hidden-id').value = idVal; document.getElementById('hidden-name').value = nameVal; // 提交表单 $('#simmapping-form').submit(); }
第三步:在表单里添加隐藏字段
打开你的#simmapping-form表单,加入两个隐藏输入框:
<?php $form = ActiveForm::begin(['id' => 'simmapping-form']); ?> <!-- 这里放你原来的表单字段 --> <!-- 添加隐藏字段用来传递参数 --> <?= Html::hiddenInput('id', '', ['id' => 'hidden-id']) ?> <?= Html::hiddenInput('name', '', ['id' => 'hidden-name']) ?> <!-- 上面的提交按钮 --> <?php ActiveForm::end(); ?>
这样提交表单时,id和name就会和其他表单字段一起被提交到后台啦。
方法2:直接修改表单的action地址
如果你不想加隐藏字段,也可以在点击按钮时,把参数拼接到表单的action地址后面,再提交:
修改按钮的onclick事件
<a class="<?= $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary' ?>" onclick="submitFormWithParams('spin', 'create');" href="javascript:;"> <?= $model->isNewRecord ? 'Create' : 'Update' ?> </a>
对应的JS函数
function submitFormWithParams(idVal, nameVal) { var form = $('#simmapping-form'); // 拼接参数到原action地址后面,用encodeURIComponent处理特殊字符 var newAction = form.attr('action') + '?id=' + encodeURIComponent(idVal) + '&name=' + encodeURIComponent(nameVal); // 更新表单的action form.attr('action', newAction); // 提交表单 form.submit(); }
方法3:用Yii2的Url助手直接生成带参数的地址
如果你想在PHP层面就处理好带参数的提交地址,可以用Yii的Url::to()方法:
<a class="<?= $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary' ?>" onclick="$('#simmapping-form').attr('action', '<?= Url::to(['your-controller/your-action', 'id' => 'spin', 'name' => 'create']) ?>').submit();" href="javascript:;"> <?= $model->isNewRecord ? 'Create' : 'Update' ?> </a>
把your-controller/your-action换成你实际的控制器和动作名就行,这种方式不用写额外的JS函数,更简洁。
内容的提问来源于stack exchange,提问作者Moeez
相关产品推荐
相关产品推荐

