学习利用JSON 摆脱表单与业务对象双向转换的繁琐工作

  1. 我想所有处理表单程序的同仁都会觉得很无聊,显示数据的时候要将业务对象一一绑定到表单,处理提交表单的时候要将包含在表单中的字段一个个再绑定到业务对象。这个过程很繁琐,而且修改的时候也不愉快。
    以前表单的处理程序基本上都延着这样的套路(这里以C#为例,其它语言大致相同):
    textBoxPersonName.Text = person.Name;
    textBoxPersonBirthday.Text = person.Birthday.ToString("yyyy-MM-dd");
    int index = 0;
    for(int i=0; i<dtBirthplac.Rows.Count; i++){
        if(dtBirthplac.Rows[i]["Code"].ToString() == person.Birthplac){
            index = i;
            break;
        }
    }
    dropdownListPersonBirthplace.SelectedIndex = index;
    ……
    或者直接在模板上处理的代码如下(这里以Velocity为例,其模板语言它大致相同):
    <input id="PersonName" name="PersonName" value="$!person.Name" />
    <input id="Birthday" name="Birthday" value="$!person.Birthday.ToString("yyyy-MM-dd")" />
    #foreach($r in $dtBirthplac.Rows)
        #if($r.Code == $person.Birthplac)
            <option value="$r.Code" selected="selected">$r.Desc</option>
        #else
            <option value="$r.Code">$r.Desc</option>
        #end
    #end
    提交表单的时候同样繁琐,很多时候会涉及到类型转换,属性比较多的时候更是无法忍受,代码如下:
    person.Name = request["Name"];
    person.Birthplace = int.Parse(request["Birthplace"]);
    ……
  2. 现在
    如果可以将对象的双向绑定自动化好了(即可以从对象转化为表单,将表单直接转化为对象)。Javascript中对象是韧性的(flexibility),用代码可以随时修改对象的成员。在客户端用js可以很容易实现字段的绑定。客户端部分可以采用同一的Javascritp来处理。如:
    var person = {
        Name: 'lisq',
        Birthday:'100'
    }
    <form id="formPerson">
        <input name="Name" />
        <input name="Birthplace" />
    </form>
    <script>
        for(p in person){
            $(p).value = person[p]
        }
    </script>
    提交表单也从传统的form.submit()转变为,先将表单转为json格式(参考json的js的实现 Prototype的Form对象),然后再提交表单,综合ajax应用,代码如下:
    <script>
        var p = formPerson.serialize(true)
        var paras = 'O=' + p.toJSONString()
        request(url, paras, function(){
            alert('保存成功!')
        })
    </script>
    服务器端得到的字段只有O,而不是从前的Name,Birthplace,O是经过转化的字符串{Name: 'lisq',Birthday:'100'},服务器端做一个Json到C#Object的转化,Person p = JSON.Serialize(request["O"], typeof(Person))(参考json的C#实现),如果数据访问层有较好的实现再添加一行代码就可以做到p.Save()(参考NHibernate)。如此这般甚好!!!

当然这样的双向绑定中会出现很多细节,尤其是服务器端的json反向解析,由json格式的字符串回到服务器需要根据不同的平台语言做具体的实现。不过不管怎么样,这也是一种尝试吧,希望能对以后表单程序的开发有所启发。

posted @ 2007-10-21 13:01 布尔 阅读(2939) 评论(12)  编辑 收藏 所属分类: Javascript

  回复  引用  查看    
#1楼 2007-10-21 13:58 | Cat Chen      
这想法挺有创意,但是依赖于客户端JavaScript实现绑定(同时依赖于服务器端对JSON的支持,虽然这已在ASP.NET AJAX内置),因此如果客户端不支持JavaScript,那就出问题了。
  回复  引用  查看    
#2楼 [楼主]2007-10-21 15:25 | 布尔      
@Cat Chen
谢谢关注,美中不足的就是依赖于客户端对Javascript的支持。另外这想法应该可应用到动态表单中。
  回复  引用    
#3楼 2007-10-21 16:05 | C+++ [未注册用户]
这个 我也正在研究
涉及的问题很复杂 估计相关代码能写一个框架了 前几天公司做的一个表单 涉及了很多东西 比如多选单选等等 还有其他的 我正一团乱麻呢 慢慢梳呢~晕啊~
  回复  引用  查看    
#4楼 2007-10-21 17:10 | Cat Chen      
@布尔
是的,动态表单你可以去跟彭斌(id: ugoer)讨论去,他最近对这事情很有兴趣。
  回复  引用  查看    
#5楼 [楼主]2007-10-21 17:32 | 布尔      
@C+++
如果考虑Javascript做的话,可以考虑Prototype的功能,我使用的效果还可以。
  回复  引用  查看    
#6楼 [楼主]2007-10-21 17:34 | 布尔      
@Cat Chen
我会去关注一下他的文章
  回复  引用  查看    
#7楼 2007-10-22 00:58 | 木野狐(Neil Chen)      
jQuery 里面也有对 form 的 ajax 提交包装,可以看一下。
现在你这个想法里客户端如何把验证代码集成进去,可能需要制定一个规则比较好。
  回复  引用  查看    
#8楼 [楼主]2007-10-22 07:15 | 布尔      
@木野狐(Neil Chen)
最简单的是对每个字段加一些特性,如类型、长度、必填项、错误信息、帮助信息等等
这样就可以创建一个字段类,错误和帮助可以做统一的机制。有时间我将做一个实现。

  回复  引用  查看    
#9楼 2007-10-22 08:48 | Cat Chen      
@布尔
他现在比较少直接在blog上交流了,你加他的MSN吧。
  回复  引用    
#10楼 2007-10-23 01:45 | 12356 [未注册用户]
我也在做这样的一个实现
最重要的问题就是解决验证
  回复  引用  查看    
#11楼 [楼主]2007-10-23 07:43 | 布尔      
@12356
一体化后就容易多了,应用在一个行业中。
  回复  引用  查看    
#12楼 2008-07-29 16:40 | shawnliu      
不错 有点创新

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2007-10-22 21:53 编辑过


相关链接: