ajax的success函数获取不到返回的值(或者返回的json带有K_BackingField)

首先看下我们的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获取的也是正常的数据了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值