父子窗体间传递JSON格式的数据

  在开发的项目中,遇到这样一个例子:当用户选择某一个用户名时,弹出当前用户的评分卷,该评分卷列出了所有一级评分项,让用户进行评分操作。如果某个一级评分项包含评分子项,则点击该评分项时,再弹出一个新窗口,新窗体中列出了当前评分项的所有评分子项列表,供用户进行操作。用户操作完成后,点击“确定”按钮,则返回到父窗体,在子窗体中所有的操作结果,同时要带到父窗体中。同时,如果用户再次点击该评分项,则在弹出子窗体的同时,要将上次操作的结果绑定到对应的操作项上。

  上面描述的例子,就涉及到了一个父子窗体间的数据传递。如何实现这一数据传递,当然有很多方法。这里只是记录一下在这个例子中我使用的方法。我的方法是在子窗体点击“确定”按钮时,将操作结果构造成json格式的字符串,通过调用父窗体上的方法:opener.方法(),将json格式数据传递到父窗体上。

  此例中构造的json数据类似如下格式:

  {"MyData":[

    {"bh":"111","lx":"1","df":"10","bz":"aaa"},

    {"bh":"112","lx":"2","df":"20","bz":"bbb"},

    {"bh":"113","lx":"2","df":"30","bz":"ccc"}

  ]}

  此处子项打分需要保持的分别是bh:编号;lx:类型;df:得分;bz:备注。

  按照自己的需要,可以再自己增加需要保持的项。构造此json数据可以放在前台,也可以放在后台。

  在此例中,我是放置后台的。代码如下:

代码
   
     
1 StringBuilder jsonBuilder = new StringBuilder();
2 jsonBuilder.Append( " @{\ "" );
3   jsonBuilder.Append( " MyData " );
4 jsonBuilder.Append( " \ " :[ " );
5
6 int k = bh.Split( ' , ' ).Length + 1 ;
7 for ( int i = 0 ; i < bh.Split( ' , ' ).Length; i ++ )
8 {
9 tem += " update KH_PFX set DF = ' " + EncriptLib.EncriptLib.EncodeCode(Convert.ToDouble(df.Split( ' , ' )[i].ToString().Trim())) + " ', " ;
10 tem += " BZ = ' " + bz.Split( ' , ' )[i].ToString().Trim() + " ',PFRXM = ' " + Session[ " XM " ].ToString() + " ', " ;
11 tem += " PFRBH = ' " + Session[ " YHBH " ].ToString() + " ',PFRQ = to_date(' " + DateTime.Now.ToShortDateString() + " ','yyyy-MM-dd') " ;
12 tem += " where BH = ' " + bh.Split( ' , ' )[i].ToString().Trim() + " ' " ;
13 tem += " " ; // 此处用此特殊的符号来分隔sql语句
14
15 jsonBuilder.Append( " {\ " bh\ " : " + " \ "" + bh.Split(',')[i].ToString().Trim() + " \ "" + " , " );
16 jsonBuilder.Append( " \ " lx\ " : " + " \ "" + lx.Split(',')[i].ToString().Trim() + " \ "" + " , " );
17 jsonBuilder.Append( " \ " df\ " : " + " \ "" + df.Split(',')[i].ToString().Trim() + " \ "" + " , " );
18 jsonBuilder.Append( " \ " bz\ " : " + " \ "" + bz.Split(',')[i].ToString().Trim() + " \ "" + " }, " );
19 }
20 if (tem != "" )
21 {
22 jsonBuilder.Remove(jsonBuilder.Length - 1 , 1 );
23 jsonBuilder.Append( " ] " );
24 jsonBuilder.Append( " } " );
25
26 Page.ClientScript.RegisterClientScriptBlock(GetType(), " cg " , " <Script>window.close();opener.GetZXDF('zxdf " + Request.QueryString[ " bh " ].ToString() + " ',' " + parent_df.Text.Trim() + " ',' " + jsonBuilder.ToString() + " ',\ "" + tem + " \ " );</Script> " );
27 }

 


  "@"符号可以防止在jsonBuilder.ToString()后,转义字符“\”的消失。

  调用父窗体的GetZXDF()方法,将json数据传递给父窗体。

  下面给出子窗体加载时,绑定json数据的代码

代码
   
     
1 $( function () {
2
3 // 加载时获取json,然后绑定打分结果
4 var obj = opener.GetJson($( " #txt_YCBH " ).val());
5 if ($.trim(obj) != "" ){
6 obj = " ( " + obj + " ) " ;
7 obj = eval(obj);
8 var data = obj.MyData;
9 $.each(data, function (i, n) {
10 if (n.lx == " 1 " ){
11 // 直接打分类的绑定
12 $( " #lx " + n.bh).siblings( " input " ).eq( 0 ).val(n.df);
13 $( " #lx " + n.bh).siblings( " input " ).eq( 1 ).val(n.df);
14 $( " #lx " + n.bh).parent().parent().next().children().children( " textarea " ).val(n.bz);
15 }
16 if (n.lx == " 2 " ){
17 // 选项打分类的绑定
18
19 $( " #lx " + n.bh).siblings( " input:text " ).eq( 1 ).val(n.df);
20 $( " #lx " + n.bh).siblings( " input:checkbox " ).each( function (){
21 if ($.trim($( this ).val()) == $.trim(n.df)){
22 $( this ).attr( " checked " , true );
23 }
24 });
25 $( " #lx " + n.bh).parent().parent().parent().next().children().children( " textarea " ).val(n.bz);
26 }
27 });
opener.GetJson()方法是父窗体上用来向子窗体传递json数据的方法,代码如下:

  //通过编号获取对应评分项的子项打分结果的json字符串
        function GetJson(p_bh)
        {

   //$("#zxdf" + p_bh).siblings("input").eq(1).val()中保存的就是子窗体传递给父窗体的json数据
            return $("#zxdf" + p_bh).siblings("input").eq(1).val();
        }

 

你可能感兴趣的:(json)