开发日志系列:一个表单页面的呈现与提交(一)——JSON的操作
JSON操作
引子
最近在做一个表单页面,大概是这个样子的
这里打算用一个JSON存储所有的信息,我们可以理解为,所有东西都存在一个字符串里面。方便,快捷,易读,数据库操作也方便了。甚至,可以将很多不同页面的数据存在同一个数据库同一个表内。
比如说,本页面的JSON格式如下:
{
"其他信息": [
{
"title": "修改时间",
"text": "2015-8-12 10:00"
},
{
"title": "作者",
"text": "zztdan"
}
],
"管理目标": [
{
"title": "XXXXXXXX",
"text": "XXXXXXXXXXXXXXXXXXXXXXXXXXX"
} ],
"各车间科室目标": [
{
"title": "XXXXX",
"text": "X1XXXXX0XXX2XXXXXXXXXXX80XXX3XXXXXXXXX0XXX4XXXXXXXXXX100%X"
},
{
"title": "XXXX",
"text": "X1XXXXXXXXXXX80XXX2XXXXXXXXX0XXX3XXXXXXXXXX100%X"
} ]
}
一、JS里面定义类
为了方便网站所有页面操作,我将所有的有关JSON的函数全部写出,列在一个js里面,进行调用。这样方便,通用性也好。
首先,我们放在js里面,最好写成类(或者说命名空间)的形式,而不是散装的函数。这样不容易引起冲突。
先来看如何在JS文件里写类:
JSONfunc = function ()
{
var _privatestr="privatestr";//私有化的属性
var _prinumber=1234;//私有化的属性
this.publicstr="publicstr";//公共的属性
this.func1=function(){};//公共的函数
} JSONfunc.staticstr="staticstr";//类似于静态属性 JSONfunc.LoadJSON = function (_url)//类似于静态函数
{
var ret;
$.ajax({
type: "get",
url: _url,
dataType: "json",
async: false,
success: function (jsonobj)
{
ret = jsonobj;
},
error: function (err)
{
debugger;
ret = err;
}
});
return ret;
}
将函数,属性等写在类定义里面,则要使用这些函数,类,必须先实例化该函数,我们对比:
JSONfunc = function ()
{ } JSONfunc.LoadJSON = function (_url)
{
var ret;
$.ajax({
type: "get",
url: _url,
dataType: "json",
async: false,
success: function (jsonobj)
{
ret = jsonobj;
},
error: function (err)
{
debugger;
ret = err;
}
});
return ret;
} //----------------------------------------------------------------------- JSONfunc = function ()
{ JSONfunc.LoadJSON = function (_url)
{
var ret;
$.ajax({
type: "get",
url: _url,
dataType: "json",
async: false,
success: function (jsonobj)
{
ret = jsonobj;
},
error: function (err)
{
debugger;
ret = err;
}
});
return ret;
} }
这两种命名方式,前者可以直接调用JSONfunc.LoadJSON,后者必须先var kk=new JSONfunc();才能调用kk.LoadJSON。其调用方法和C#,JAVA里面的类规则是一致的。而在类定义里面通过var等方式定义的属性,函数(而不是用this),则相当于是private的,外部无论如何也无法访问。
二、从文件中读取类
JSONfunc.LoadJSON = function (_url)
{
var ret;
$.ajax({
type: "get",
url: _url,
dataType: "json",
async: false,
success: function (jsonobj)
{
ret = jsonobj;
},
error: function (err)
{
debugger;
ret = err;
}
});
return ret;
}//该函数返回的就是JSON对象,而不是字串
这里要注意的是async=false,如果不设置这个,那么该函数之后的语句会并行执行,下一个语句如果要调用这个JSON,肯定会出错,因为你还没读完呢,就执行到下一句去了。
三、JSON与字符串互换
JSON作为对象与字符串优秀的互异性是其流行的主要原因,很多时候不能传递对象的场合,却可以传递字符串,那么JSON也就可以传递。该函数用到了JQUERY
JSONfunc.JSONtoSTR = function (jsonobj)
{
return JSON.stringify(jsonobj);
}
JSONfunc.STRtoJSON = function (strobj)
{
return JSON.parse(strobj);
}
四、JSON与数据库的交互(Ajax)
将JSON作为字符串直接存入数据库不失为一种存储方案。但是某些排列,筛选的键值还是需要提取出来。由于本次网页只有表单名称和时间戳作为键值,所以数据库就很简单了:

(1)前台命令
前台传递给后台的是一个表单(使用$.ajax函数),或者说,是一群键值对,或者说是结构单一的JSON,下面是一个这类型的JSON的示范以及函数调用:
var _name = "EnvironmentSys"; var _jsonobj = strJson;//已经转换好的str格式的json
var _form = { "action": "SaveJsonToDB", "name": _name, "JSONDATA": _jsonobj };
JSONfunc.postJsontoHandler(_form);
下面是所要调用的Ajax函数:
JSONfunc.postJsontoHandler = function (formkk)
{
var ret = ""; $.ajax({
type: "post", //要用post方式
url: "/ajax/JsonHandler.aspx?r=" + Math.ceil(Math.random() * 10000),//插入一个随机数
//contentType: "application/json; charset=utf-8",
//dataType: "json",
data: formkk,//表单内容可以随意定制。注意,这里要求的表单是对象,而不是字符串,传递进来的formkk就是一个对象,如果这里输入字符串那么后台不能成功读取
async: false,
success: function (d)
{
ret = d;
},
error: function (err)
{
ret = err.responseText;
}
});
return ret;
}
注意:
- 可以在web.config里面管理http管道,截获这个网页请求,然后将其导向需要的dll,但是我不想那么麻烦,所以直接将请求指向了一个有后台代码的aspx。当然你可以指向任何阿猫阿狗,这样你就需要写web.config了,还要将相应的函数封装成dll,想想都累。
- 在请求地址后面加入一个随机数,可以使得浏览器忽略缓存,直接访问该页面本身。浏览器是很懒的,如果它发现它已经请求过这个页面了,它会直接读取缓存中这个页面返回的结果,也就是你以前的请求结果。无论你将目标页面改的面目全非,它都不看一眼。只有让他认为这是个全新页面,它才会认真地发送请求。
(2)后台代码
public partial class ajax_JsonHandler : System.Web.UI.Page {
protected void Page_Load(object sender, EventArgs e) {
switch (Request["action"]) {
case ("SaveJsonToDB"): {//将json存入固定的数据库位置,提供用户名和存入时间
SaveJson save = new SaveJson(Request["name"], Request["JSONDATA"]);
string saveDB = save.SaveDB();
Response.Write(saveDB);
Response.End();
break;
}
default: { break; }
}
}
}
public class SaveJson {
private string _name;
private string _url;
private string _jsonobj;
public SaveJson(string name, string url, string jsonobj) {
_name = name;
_url = url;
_jsonobj = jsonobj;
}
public SaveJson(string name, string jsonobj) {
_name = name;
_jsonobj = jsonobj;
}
public string SaveDB() {
int rows;
string time = DateTime.Now.ToString();
string source = ConfigurationManager.ConnectionStrings["EPInfoSys"].ConnectionString.ToString();
string DBcommand =
@"INSERT INTO [EPInfoSystem].[dbo].[JsonTable]
([表名]
,[时间]
,[类型]
,[内容])
VALUES
('" + _name + "','" + time + "','json','" + _jsonobj + "')";
SqlConnection conn = new SqlConnection(source);
try {
conn.Open();
SqlCommand ads = new SqlCommand(DBcommand, conn);
rows = ads.ExecuteNonQuery();
}
catch (Exception ex) {
return (ex.Message);
}
finally {
conn.Close();
}
return "数据库备份录入成功,影响" + rows.ToString();
}
}
类操作,很简单,不必多解释了。
先写这些,明天写一点关于C#的文件操作吧。
开发日志系列:一个表单页面的呈现与提交(一)——JSON的操作的更多相关文章
- 基于react hooks,zarm组件库配置开发h5表单页面
最近使用React Hooks结合zarm组件库,基于js对象配置方式开发了大量的h5表单页面.大家都知道h5表单功能无非就是表单数据的收集,验证,提交,回显编辑,通常排列方式也是自上向下一行一列的方 ...
- 【HTML5开发系列】表单元素
<form> 创建一个HTML表单 属性: action 表示提交表单时浏览器应该把用户填写的数据发送到什么地方 method 用来指定表单数据发送到服务器的方式.允许值有get和post ...
- C# Winform 通过FlowLayoutPanel及自定义的编辑控件,实现快速构建C/S版的编辑表单页面
个人理解,开发应用程序的目的,不论是B/S或是C/S结构类型,无非就是实现可供用户进行查.增.改.删,其中查询用到最多,开发设计的场景也最为复杂,包括但不限于:表格记录查询.报表查询.导出文件查询等等 ...
- Winform 通过FlowLayoutPanel及自定义的编辑控件,实现快速构建C/S版的编辑表单页面 z
http://www.cnblogs.com/zuowj/p/4504130.html 不论是B/S或是C/S结构类型,无非就是实现可供用户进行查.增.改.删,其中查询用到最多,开发设计的场景 也最为 ...
- JS组件系列——Form表单验证神器: BootstrapValidator
前言:做Web开发的我们,表单验证是再常见不过的需求了.友好的错误提示能增加用户体验.博主搜索bootstrap表单验证,搜到的结果大部分都是文中的主题:bootstrapvalidator.今天就来 ...
- AngularJs 入门系列-2 表单验证
对于日常的开发来说,最常见的开发场景就是通过表单编辑数据,这里涉及的问题就是验证问题. angularjs 内置已经支持了常见的验证方式,可以轻松实现表单验证. 1. 绑定 为了方便,我们在 $sco ...
- Winform开发框架之客户关系管理系统(CRM)的开发总结系列4-Tab控件页面的动态加载
在前面介绍的几篇关于CRM系统的开发随笔中,里面都整合了多个页面的功能,包括多文档界面,以及客户相关信息的页面展示,这个模块就是利用DevExpress控件的XtraTabPage控件的动态加载实现的 ...
- AngularJS系列:表单全解(表单验证,radio必选,三级联动,check绑定,form提交验证)
一.查看$scope -->寻找Form控制变量的位置 Form控制变量 格式:form的name属性.input的name属性.$... formName.inputField.$pristi ...
- SharePoint Designer定制MOSS/WSS表单页面
转:http://blog.csdn.net/yl_99/article/details/7087897 方法一.使用SharePoint Designer配合enderingTemplate文件来定 ...
随机推荐
- iOS 转让APP
今天需要将一个客户的app转让到它公司的个人账号上,记录下来流程,给有需要的人方便查看. 上面这个是咨询了苹果的客户之后收到的邮件说明,有需要的大家自己仔细看看. 好了,进入正题: 一:转出方操作 1 ...
- Struts中文件的上传与下载
前面学到的用组件去上传 前台: 1.post表单提交 2.表单类型 multipart/form-data 3.intput type=file 后台: Apach提供的FileUpload组件 核心 ...
- XMLHTTP使用具体解释
XMLHTTP对象是Microsoft的MSXML开发包中带的一个用HTTP,XML协议訪问web资源的对象. 从MSXML3.0開始出现. 它在AJAX技术中主要用来从其它网络资源获取信息,然后由j ...
- node.js 针对不同的请求路径(url) 做出不同的响应
边看这个边写的: http://wenku.baidu.com/link?url=C4yLe-TVH6060u_x4t34H3Ze8tjoL7HjJaKgH-TvHnEYl-T_gAMYwhmrCeM ...
- (收藏)sokcet编程
C# Socket网络编程精华篇 C#编写高性能网络服务器(源码) .net自动更新组件Ant 客户端服务器通信demo(附源码) 有了WCF,Socket是否已人老珠黄? Socket服务器整体架构 ...
- check_area
CCTouch* pTouch = ...; CCSprite* pSprite = ...; CCRect rect = pSprite ->boundingBox(); if ((& ...
- jemalloc源码结构分析(二):CPU字节对齐算法
在调用arena_malloc_small过程中,要根据申请内存大小,进行对齐计算,然后分配一个整块儿.算法如下: 1)定义一个SIZE_CLASSES宏,它主要用于生成后面两个表,small_siz ...
- Web安全测试周末公开班计划5月24、25日开课,欢迎报名参加!
Web安全测试周末公开班计划5月24.25日开课,欢迎报名参加! 课程大纲参考: http://gdtesting.com/product.php?id=107 报名咨询: 黎小姐 QQ:241448 ...
- oracle学习总结5(游标、触发器、过程、方法)
1:捕获plsql抛出的异常 declarev_ename emp.ename%type;beginselect ename into v_ename from emp where empno=10; ...
- innodb对update的处理
当更新非聚集索引上记录 和 聚集索引上的主键时,是标记删除,然后插入新的记录 当更新聚集索引上的非主键列时,是updated-in-place,也就是说原地修改,不会插入新记录. 之前一直以为都是以标 ...