总结背景:这个学期我们有数据库课设,我本来是比较擅长JSP的,结果老师指明不让用JAVA,我虽然对C#窗体编程较为熟练可是实在是不想再去学ASP,因为我肯定不会深入学下去,学什么MVC模型……(我jsp都学过了,还研究了不少)。
为了不学习ASP(虽然我懂 拖控件与 标签上加个 runat=“server”,可以直接操纵HTML元素,十分简单,可我就是不想接触ASP的知识),我从很早就策划绕过ASP的学习。凭我的经验我想到AJAX传参了,传数据当然还是JSON方便,于是蓄谋已久的计划终于在课设的时候用到了。 由于其中用到了大量的js,jQuery知识,我还不太懂,所以做起来十分吃力。班里就是从没接触过C#凭借着拖控件也比我做的快。最后过了五天2:30睡7:00起的生活,终于在最后一天做完。
昨天我又做了JAVA的JSON传参,发现很不一样(真的是不一样),所以打算记下来。
介绍开始:
前台部分:(先贴代码)
function modifyStuAjax(para){
var mg=null;//将要传回去的 js 对象(Object)的结果
para = JSON.stringify(para); //将传来的参数(js 对象)解析成JSON对象
$.ajax({ //jQuery的AJAX传参
type: "POST", //post方法
url: "../../aspx/student.aspx/modifyStu", //访问请求处理的函数
data: para, //要传的参数
contentType: "application/json;charset=utf-8",// 应该是请求的头格式,指明传向后台的是JSON格式的数据
dataType: "json", //后台返回JSON格式的字符串
async:false, //不写也行,写上是为了同步,而不是异步执行
success: function (msg) {
mg = JSON.parse(msg.d); //成功后msg得到后台传来的JSON格式的字符串,解析成js 对象
},
error: function (xmlReq, err, c) {
ShowDIV("request fail,可能您未登录"); //失败后处理,alert也行
}
});
return mg;
}
我所写的并不是一定都要,但是我之前试过,如果去掉其中某一个部分,都无法正常运行。 值得注意的是msg.d,这个d是被自动加上去的,chrome的network可以看到形如{“d":{ 这里是你真正处理后返回的JSON对象 }}的数据,做过JAVA后我发现可能是ASP自己给加的,有待考证,希望有人指点。
必须有的:JSON.stringify,JSON.parse,contentType: "application/json;charset=utf-8",dataType: "json",(当然不用JSON可写成text等),data也必须是JSON类型的,如果不传参的话,也要写个“{‘a':'a'}”这样的JSON格式参数。
其中URL里面倒数第一个’/‘后面的是要访问的方法(在aspx.cs中可以访问需要参数的,也一样这样写),它前面的是cs对应的ASPX页面。
顺便说一下 他们关联靠的是 ASPX最上面的<%@ Page Language="C#" AutoEventWireup="true" CodeFile="searchstudent.aspx.cs" Inherits="page_student_searchstudent" %>
前台调用:
var para={
stu:{
sno:modifysno,
sname:sname,
ssex:ssex,
sphone:sphone,
snation:snation,
smid:smid,
sclass:sclass
}
};
//alert(21);
var msg=modifyStuAjax( para );
para要写成js对象的形式。这样你会问,后台该怎么得到这些参数呢?这个后面讲。还有得到数据的处理,也就不说了,那是js的知识。
前台结束。
后台部分:
个人认为C#的 Newtonsoft.Json 处理JSON数据比较方便(还有一个.net 3.0以上自带的 解析器,可以直接解析对象,我说的这个处理器数组,list与对象不很方便,但是我会用),所以首先下载 Newtonsoft.Json的dll然后引入项目中。
我先把前后台传参的事说一下。
后台给前台传参就是返回一个string,只不过是json格式的。前台给后台传参,也就是给访问后台的静态函数传参数。后台定义这个参数的名字,必须和前台传来的JSON,数据对应上,这个实在讲不清楚,反正记住 这时ASP自己映射的,名字取得一样才可以映射过去。 比如我上面的 参数 后台的 代码形如
[WebMethod]
public static string modifyStu(strudent stu){}
student 是我自己定义的class,里面有字段 sno,sname,ssex……现在总该知道怎么自动传参了吧。 还有如果传两个参数 前台就要类似
{ pa1:{},pa2:{} }
后面的就是我自己总结给自己看的Newtonsoft.Json使用就不说明了。
[WebMethod]
public static string gainDormShowInfo(){
dormDao dormdao = new dormDao();
List<bd_showinfo> bdinfos =dormdao.gainDormShowInfo();
StringWriter sw = new StringWriter();
JsonWriter writer = new JsonTextWriter(sw);
writer.WriteStartObject();
writer.WritePropertyName("rt");
if (bdinfos == null)
{
writer.WriteValue("false");
}
else
{
writer.WriteStartArray();
building bd;
foreach (bd_showinfo binf in bdinfos)
{
bd = binf.Bd;
writer.WriteStartObject();
writer.WritePropertyName("bd");
writer.WriteStartObject();
writer.WritePropertyName("bno");
writer.WriteValue(bd.Bno);
writer.WritePropertyName("bhomenum");
writer.WriteValue(bd.Bhomenum);
writer.WritePropertyName("bfloornum");
writer.WriteValue(bd.Bfloornum);
writer.WritePropertyName("bbegintime");
writer.WriteValue(bd.Bbegintime);
writer.WriteEndObject();
writer.WritePropertyName("gnums");
writer.WriteValue(binf.Gnums);
writer.WritePropertyName("bnums");
writer.WriteValue(binf.Bnums);
writer.WritePropertyName("gdorms");
writer.WriteValue(binf.Gdorms);
writer.WritePropertyName("bdorms");
writer.WriteValue(binf.Bdorms);
writer.WriteEndObject();
}
writer.WriteEndArray();
}
writer.WriteEndObject();
writer.Flush();
string jsonText = sw.GetStringBuilder().ToString();
return jsonText;
}
上面产生的JSON 包括的数组,对象里面嵌套对象,我研究了好一会而才写出的。
这是ASP的后面我要总结JSP的,不是很一样。
转载请注明出处,谢谢。