学习利用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格式的字符串回到服务器需要根据不同的平台语言做具体的实现。不过不管怎么样,这也是一种尝试吧,希望能对以后表单程序的开发有所启发。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏领域驱动设计DDD实战进阶

微服务实战(六):落地微服务架构到直销系统(事件存储)

在CQRS架构中,一个比较重要的内容就是当命令处理器从命令队列中接收到相关的命令数据后,通过调用领域对象逻辑,然后将当前事件的对象数据持久化到事件存储中。主要的...

1292
来自专栏大内老A

通过重建Hosting系统理解HTTP请求在ASP.NET Core管道中的处理流程[中]:管道如何处理请求

从上面的内容我们知道ASP.NET Core请求处理管道由一个服务器和一组中间件构成,所以从总体设计来讲是非常简单的。但是就具体的实现来说,由于其中涉及很多对象...

3039
来自专栏pangguoming

tomcat 用AXIS2发布WebService 网站的方法

Axis2+tomcat7.0 实现webService 服务端发布与客户端的调用。   Aixs2开发webService的方法有很多,在此只介绍一种比较简单...

5156
来自专栏Kurt Niu 的博客

C# Int 类型线程不安全

之前统计报表算法做了一个优化,一个查询二十分钟导致客户端超时,优化到只需要5秒钟。后来发现for循环里数据合并的时候耗时,就用并行做优化。但是发现并行后丢居然数...

1022
来自专栏恰童鞋骚年

.NET基础拾遗(5)多线程开发基础

  下面的一些基本概念可能和.NET的联系并不大,但对于掌握.NET中的多线程开发来说却十分重要。我们在开始尝试多线程开发前,应该对这些基础知识有所掌握,并且能...

1262
来自专栏Play & Scala 技术分享

Play Scala 2.5.x - Play with MongoDB 开发指南

3345
来自专栏代码世界

Django 中间件

中间件 前言   之前我们给视图函数加装饰器来判断是用户是否登录,把没有登录的用户请求跳转到登录页面。我们通过给几个特定视图函数加装饰器实现了这个需求。但是以后...

51013
来自专栏一“技”之长

iOS 单例设计模式解读 原

      顾名思义,单例,即是在整个项目中,这个类的对象只能被初始化一次。它的这种特性,可以广泛应用于某些需要全局共享的资源中,比如管理类,引擎类,也可以通过...

902
来自专栏抠抠空间

Django之views系统

Django的View(视图)简介 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应。 响应可以是一张网页...

4127
来自专栏walterlv - 吕毅的博客

生成代码,从 T 到 T1, T2, Tn —— 自动生成多个类型的泛型

发布于 2018-01-31 05:38 更新于 2018-05...

772

扫码关注云+社区

领取腾讯云代金券