首先看下我们的ajax:
$.ajax({
url: "Handler/GetUsers.ashx",//路径
type: "get",//get请求
data: { "LoginName": "Admin" },
dataType:"json",
async: false,//同步
cache: false,//不缓存
//成功调用的函数
success: function (datas) {
alert(datas); //这里如果返回{object:object}
alert(datas.LoginName);//而这里在f12调式工具中提示错误,或者为undefined,并且LoginName并没有写错
},
//发生错误调用的函数
error: function (errmsg) {
alert("发生错误!");
}
});
接下来看我们的ashx(一般处理程序)
public void ProcessRequest (HttpContext context) {
context.Response.ContentType = "text/plain";
string LoginName = context.Request.Params["LoginName"];
Users model = new TestService().GetList_Users(LoginName);
DataContractJsonSerializer ds = new DataContractJsonSerializer(typeof(Users));
ds.WriteObject(context.Response.OutputStream, model);
}
我们用的是DataContractJsonSerializer这个类去序列化成json,并返回值
(注意:用DataContractJsonSerializer需引用命名空间 System.Runtime.Serialization.Json;)
接下来我们看看我们ajax获取到的datas是什么?
运行vs,等执行了ajax并且返回了值我们按f12进入tiao调试者工具。找到Network这个选项点击
找到对应的ashx,你会发现我们的键值中的键跟我们model中的不一样,多出来K_BackingField这一项.
这是怎么回事呢?那是因为我们序列化的这个类中被我们加上了[Serializable]这个特性,我们只用这样写就可以正常获取了
[Serializable]
[DataContract]
public class Users
{
[DataMember]
public int Uid {get;set;}//Id
[DataMember]
public string LoginName {get;set;}//登陆账号
[DataMember]
public string LoginPwd {get;set;}//登陆密码
[DataMember]
public int Rid {get;set;}//角色id
[DataMember]
public int EId { get; set; }//员工id
}
在类加上一个[DataContract]这个特性,下面的列也要加上[DataMember]这个特性,这样我们获取的json就不会出现K_BackingField了。注意 需引用命名空间using System.Runtime.Serialization。
然后我们重新生成,进行运行vs查看效果。
我们的json数据没有了K_BackingField了,datas.LoginName获取的也是正常的数据了。