jQuery MiniUI

标题: 表单数据组织方法form.getData对同名控件不能获取值 [打印本页]

作者: veryfine    时间: 2013-3-13 17:34:29     标题: 表单数据组织方法form.getData对同名控件不能获取值

当我在编辑页面时,如果有两个同名的隐藏域控件,在执行form.getData方法后,不能获取同名控件的值,按理说应该是获取到一个数组对象值才对,请官方核实处理。

作者: niko    时间: 2013-3-14 16:32:10

给你一个例子,能满足你的要求:
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4.     <title>Form</title>
  5.     <meta http-equiv="content-type" content="text/html; charset=UTF-8" /><link href="../demo.css" rel="stylesheet" type="text/css" />

  6.    
  7.     <script src="../../scripts/boot.js" type="text/javascript"></script>
  8.    

  9. </head>
  10. <body>
  11.     <h1>Form 表单</h1>      
  12.       

  13.     <div id="form1" >
  14.         <table>
  15.             
  16.             <tr>
  17.                 <td>
  18.                     <label for="textbox1$text">UserName:</label>
  19.                 </td>
  20.                 <td>
  21.                     <input name="username" class="mini-textbox" required="true" />
  22.                 </td>
  23.             </tr>
  24.             <tr>
  25.                 <td>
  26.                     <label for="textbox1$text">XXX:</label>
  27.                 </td>
  28.                 <td>
  29.                     <input name="xxx[0].a" class="mini-textbox" required="true" />
  30.                 </td>
  31.             </tr>
  32.             <tr>
  33.                 <td>
  34.                     <label for="textbox1$text">XXX:</label>
  35.                 </td>
  36.                 <td>
  37.                     <input name="xxx[1].a" class="mini-textbox" required="true" />
  38.                 </td>
  39.             </tr>
  40.             <tr>
  41.                 <td>
  42.                     
  43.                 </td>
  44.                 <td>
  45.                   
  46.                     <input value="SetForm" type="button" onclick="setForm()" />
  47.                     <input value="GetForm" type="button" onclick="getForm()" />
  48.                                                          
  49.                 </td>
  50.             </tr>
  51.         </table>
  52.     </div>
  53.     <script type="text/javascript">
  54.         mini.parse();
  55.         
  56.         function getForm() {
  57.             var form = new mini.Form("#form1");
  58.             var data = form.getData(true, true);
  59.             var s = mini.encode(data);
  60.             alert(s);
  61.             //form.setIsValid(false);
  62.         }
  63.         function setForm() {
  64.             var obj = {
  65.                 username: "aaa",
  66.                 xxx: [{ a: 1 }, { a: 2}]
  67.             };
  68.             var form = new mini.Form("#form1");
  69.             form.setData(obj, true, true);
  70.         }

  71.     </script>
  72.    
  73.    
  74. </body>
  75. </html>
复制代码
注意要下载最新版,刚更新的。
作者: veryfine    时间: 2013-3-15 17:09:56

本帖最后由 veryfine 于 2013-3-19 11:48 编辑
niko 发表于 2013-3-14 16:32
给你一个例子,能满足你的要求:注意要下载最新版,刚更新的。

jquery里ajax有一个参数traditional,是可以有选择性地防止ajax调用$.param对传入的json数据进行深度序列化。
默认traditional=false,即要为迎合各种新的开发框架(如:struts2等)对于传递参数的要求作深度序列化,如传递的JSON参数为:data: {"xxx": [1, 2]},序列化后的参数为:xxx[]=1&xxx[]=2,若将traditional=true,同样的JSON参数序列化后的参数为:xxx=1&xxx=2,前者适用于目前各类开发框架下获取参数(你给出的例子也是为目前流程框架所准备的数据格式),而后者适用于用传统的开发方式获取参数(如:servlet的request.getParameterValues),而刚好目前我使用的是自己开发的一个基于servlet进行了轻度封装的开发框架(主要是觉得目前各种流行的开发框架越来越复杂,开发效率也得不到实质的提升,学习的成本也高,高级功能我们多半也用不上),而这样的情况下,对于如果要传递同名的控件参数,在程序后台直接将参数值获取成一个数组,就会有问题。目前我的方式是如下:

// 将附件列表附上
                    var attach_id = new Array();
                    $("#editform input[name=attach_id]").each(function(i) {
                            attach_id.push(this.value);
                    });

                    gridCharge.loading("保存中,请稍后......");
                    $.ajax({
                        url: "store_oa_cush_WholesalerChargeSave",
                                        dataType: 'json',
                                        cache: false,
                                        type: 'POST',
                        data: {"data": mini.encode(data), "attach_id": attach_id},
                        traditional: true,

                        success: function (text) {
                            gridCharge.reload();
                        },
                        error: function (jqXHR, textStatus, errorThrown) {
                            alert(jqXHR.responseText);
                        }
                    });

综上所述,目前对于参数的处理方式没有什么大问题,我只是希望miniui能够兼容原始的参数传递方式,不要丢弃。既然jquery也保留了traditional这个开关,我们miniui是否也应该在form.getData()时考虑这样的问题。




欢迎光临 jQuery MiniUI (http://miniui.com/discuss/) Powered by Discuz! X2