json实现前后台的相互传值详解
前后台的相互传值如果值太多,写的麻烦累人,且容易出错。这里整理出一套使用标记标签属性的办法来传值,后台取值和前台的绑定都有了大大的简化。
一、把json对象转成字符串
$.extend({
//将json对象转换成字符串 [貌似jquery没有自带的这种方法]
toJSONString:function(object){
if(object==null)
return;
vartype=typeofobject;
if('object'==type){
if(Array==object.constructor)type='array';
elseif(RegExp==object.constructor)type='regexp';
elsetype='object';
}
switch(type){
case'undefined':
case'unknown':
return;
break;
case'function':
case'boolean':
case'regexp':
returnobject.toString();
break;
case'number':
returnisFinite(object)?object.toString():'null';
break;
case'string':
return'"'+object.replace(/(\\|\")/g,"\\$1").replace(/\n|\r|\t/g,function(){
vara=arguments[0];
return(a=='\n')?'\\n':(a=='\r')?'\\r':(a=='\t')?'\\t':""
})+'"';
break;
case'object':
if(object===null)return'null';
varresults=[];
for(varpropertyinobject){
varvalue=$.toJSONString(object[property]);
if(value!==undefined)results.push($.toJSONString(property)+':'+value);
}
return'{'+results.join(',')+'}';
break;
case'array':
varresults=[];
for(vari=0;i<object.length;i++){
varvalue=$.toJSONString(object[i]);
if(value!==undefined)results.push(value);
}
return'['+results.join(',')+']';
break;
}
}
});
二、创建数据容器对象[用来绑定要传给后台的前台控件值]
varDataClass={
create:function(){
returnfunction(){
this.MyInit.apply(this,arguments);//创建对象的构造函数 //arguments参数集合 系统名称不能写错
}
}
}
varMyDataPack=DataClass.create();
MyDataPack.prototype={
//初始化
MyInit:function(url,operation,params){
this.data=newObject(); //所有数据容量
varbdata=newObject();
bdata.url=url; //地址
bdata.operation=operation;//操作
bdata.params=params; //参数
this.data.BasicData=bdata;//基本数据
},
//添加数据如:addValue("obj","111");
addValue:function(p,obj){
this.data[p]=obj;
},
//取得所有标记控件的值并写入数据
getValueSetData:function(togName){
varvalues=Object();//值的集合
$("[subtag='"+togName+"']").each(function(){
//如果是input类型控件
if(this.localName=="input"){
//如果是text控件
if(this.type=="text"||this.type=="hidden"){
values[this.id]=this.value;
}
elseif(this.type=="..."){
}
//......
}
elseif(this.localName=="..."){
}
//................
});
this.data[togName]=values;//添加到数据集合
},
//取值如:getValue("BasicData")
getValue:function(p){
returnthis.data[p];
},
//获取或设置url
getUrl:function(url){
if(url)
this.data.BasicData["url"]=url;
else
returnthis.data.BasicData["url"];
}
,
//取值转成字符串的对象数据
getJsonData:function(){
return$.toJSONString(this.data);
}
}
三、创建绑定前台数据对象[用来读取后台传过来的值,并绑定到前台页面]
varMyDataBinder={
//绑定数据到控件data:数据tag:标签
Bind:function(data,Tag){
varMJson=$.parseJSON(data);
//只绑定标记了的标签
$("[bindtag='"+Tag+"']").each(function(){
if(this.localName=="input"){
if(MJson[this.id])//如果后台传了值
$(this).attr("value",MJson[this.id]);
}
elseif(this.localName=="..."){
}
//....
});
}
};
四、使用示例
前台html:
<table>
<tr>
<th>一</th>
<th>二</th>
<th>三</th>
</tr>
<tr>
<tdid="td1"><inputtype="text"id="inp_1"subtag="subtag"bindtag="bind"/></td>
<tdid="td2"><inputtype="text"id="inp_2"subtag="subtag"value="我只是测试一下下"/></td>
<td><inputtype="text"id="inp_3"subtag="subtag"bindtag="bind"/></td>
</tr>
</table>
前台js:
//====================使用示例======================================
varMyDataPack=newMyDataPack("Handler1.ashx","CESHI","");
MyDataPack.getValueSetData("subtag");//将控件数据写入对象 “subtag”为要取控件值的标签
//-------------------传前台值到后台---------------
$.post(MyDataPack.getUrl(),MyDataPack.getJsonData(),function(data){
//-------------------绑定后台值到前台-----------------
MyDataBinder.Bind(data,"bind"); //"bind"为要绑定控件的标签
});
后台:
publicvoidProcessRequest(HttpContextcontext)
{
context.Response.ContentType="text/plain";
//====================取前台值=============================================
//因为后台传过来的是json对象转换后的字符串 所以所有数据都做为一个参数传过来了
varvalues=context.Request.Form[0];
//需要引入程序集System.Web.Extensions.dll
JavaScriptSerializer_jsSerializer=newJavaScriptSerializer();
//将json对象字符串 转成Dictionary对象
Dictionary<string,Dictionary<string,string>>dic=_jsSerializer.Deserialize<Dictionary<string,Dictionary<string,string>>>(values);
//现在dic里面就包含了所有前台传过来的值想怎么用就怎么用了。
stringinp_2=dic["subtag"]["inp_2"];//这样就直接取到了前台页面id为inp_2的控件value值
//=====================传值到前台============================================
Dictionary<string,string>dic2=newDictionary<string,string>();
dic2.Add("inp_1","修改1");//这里只用对应控件id传值即可
dic2.Add("inp_2","修改2");
dic2.Add("inp_3","修改3");
context.Response.Write(_jsSerializer.Serialize(dic2));
}
小伙伴们对使用json实现前后台传值是否了解清楚了呢,有问题的话,就给我留言吧