之前寒假时,试着使用jQuery写了几个异步请求demo,

但是那样是使用的webform普通页面,一般应该是用 webservice 居多。

最近写后台管理时,想用异步来实现一些信息的展示和修改,

这是第一次真正的在实际中运用ajax,卡了一个小时才做好简单的信息展示。

在这之间遇到了两个问题。写下来分享给大家,也加深一下自己的印象。

有错误的地方还请大神指出。

前端js代码:

     <script type="text/javascript">
$(function () {
$("#details").hide();
$(".details").click(function () {
showdetails($(this).attr("id"));
});
}) function showdetails(id) {
$.ajax({
url: "article.asmx/GetArticleByID",
type: "POST",
datatype: "json",
data:'{ id: ' + id + ' }',
contentType: "application/json; charset=utf-8",
success: function (data) {
var json = null;
try {
json = eval('(' + data.d + ')');
}
catch (e) {
alert(e.message);
}
$("#id").text(json.ID);
$("#title").text(json.Title);
$("#time").text(json.Time);
$("#text").text(json.Text);
$("#details").show();
}
});
</script>

前端html代码

 //点击的地方
<td><a class="details" id="<% =Convert.ToInt32(article.ID) %>">详细</a></td> //插入信息的地方
<div id="details">
<table>
<tr>
<td id="id"></td>
<td id="title"></td>
<td id="time"></td>
<td id="text"></td>
</tr>
</table>
</div>

webservice 代码

     [WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
// 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消注释以下行。
[System.Web.Script.Services.ScriptService]
public class article : System.Web.Services.WebService
{ [WebMethod]
public string GetArticleByID(int id)
{
ArticleBLL article = new ArticleBLL();
article = ArticleBLL.GetArticleByID(id); //string s = string.Empty;
//s = "{\"id\":\""+article.ID+"\",\"title\":\""+article.Title+"\",\"text\":\""+article.Text+"\",\"time\":\""+article.Time+"\"}";
//return s; JavaScriptSerializer js = new JavaScriptSerializer();
return js.Serialize(article); //Context.Response.Write(s);
//Context.Response.End();
}
}

遇到的第一个问题是,传递信息时的500报错,发现是data格式的问题,

加上contentType: "application/json; charset=utf-8"才会报的错,

这个语句告诉服务器我们传递过去的是json格式信息,所以解析不了的时候就会返回错误信息。

data要写成

data: '{ id: ' + id + ' }'

data 必须是一个“表示JSON对象的字符串”,而不是一个“JSON”对象

原因是jquery会把JSON对象序列化成标准POST的形式,你此处的{ id: id }会变成形好id=3这样的形式,而ASP.NET WebService需要的是JSON格式的数据,所以必须把你的数据变成一个JSON样子的字符串。

第二个问题是请求成功看返回数据格式也对,但是显示不出来。

默认返回的数据是xml格式,这里我使用了 JavaScriptSerializer js = new JavaScriptSerializer(); return js.Serialize(article); 来返回json格式信息。

最后被注释掉的代码是在网上看到的,是输出纯文本,可以被浏览器识别,但我没有测试,应该是可以的。

原来是需要解析一下,这个过程叫做反序列化。

我们只需要在 success 回调函数中 eval 下 jquery 通过获取 webservice 得到的返回字符串的 d 属性,就可以获取到实际的json对象了。

如下,如果方法返回的是 {"d":"{\"Title\":\"文章标题\"}"} 这种信息,我们如何获取到msg这个属性的值呢?

首先一定要明确的时,调用webservice的方法后实际获取到的json格式的字符串是这样的 {"d":"{\"Title\":\"文章标题\"}"} ,

jquery通过这个字符串生成的json对象只有一个属性,那就是d,d存储的是webservice方法返回的json格式的字符串信息,而不是 json 对象,

所以不能通过 data.d.ID来获取ID信息。而是需要 var json=eval('('+data.d+')')来生成实际的json对象,然后 josn.ID 才是需要的信息。

其实还可以直接解析xml数据,但要比json麻烦一点

http://www.cnblogs.com/qiantuwuliang/archive/2009/11/23/1609117.html

这篇文章就写了如何解析xml数据。

参考 http://www.cnblogs.com/tianguook/archive/2010/12/04/1896485.html

转载请保留出处。

ASP.net jQuery调用webservice返回json数据的一些问题的更多相关文章

  1. jQuery调用WebService返回JSON数据

    相信大家都比较了解JSON格式的数据对于ajax的方便,不了解的可以从网上找一下这方面的资料来看一下,这里就不多说了,不清楚的可以在网上查一下,这里只说一下因为参数设置不当引起的取不到返回值的问题. ...

  2. Jquery调用Webservice传递Json数组

    Jquery由于提供的$.ajax强大方法,使得其调用webservice实现异步变得简单起来,可以在页面上传递Json字符串到Webservice中,Webservice方法进行业务处理后,返回Js ...

  3. C#调用接口返回json数据中含有双引号 或其他非法字符的解决办法

    这几天,调用别人接口返回json数据含有特殊符号(双引号),当转换成json对象总是报错, json字符格式如下 { "BOXINFO":[ { ", "ITE ...

  4. Asp.Net_Ajax调用WebService返回Json前台获取循环解析

    利用JQuery的$.ajax()可以很方便的调用 asp.net的后台方法.但往往从后台返回的json字符串不能够正确解析,究其原因,是因为没有对返回的json数据做进一步的加工.其实,这里只需 要 ...

  5. jquery实现ajax,返回json数据

    jquery实现ajax可以调用几种方法 我经常用的是$get(url,data,callback,type)方法 其中url是异步请求的页面(可以是.ashx文件),data是参数,callback ...

  6. 亲测 asp.net 调用 webservice返回json

    前端脚本 $("#sure").click(function () { var tbody = $("#putsigal tbody"); var trs = ...

  7. asp.net webservice 返回json数据乱码解决方法

    [WebMethod] public void QueryRiskNotice(string phone) { try { var data = _riskNoticeDal.QueryRiskNot ...

  8. jquery 调用ajax返回json

    ie调用可以,火狐和chrome皆失败,找了半天原因. 被屏蔽了. 火狐和chrome 对同一个域名不同端口的调用也严格限制,不给调用.只能用jsonp. 查看网络的返回状态,错误信息,F12 很重要 ...

  9. [转]jQuery调用ASPX返回json

    本文转自:http://www.cnblogs.com/fire-phoenix/archive/2009/11/13/1614146.html 本文介绍如何在ASP.NET(ASP.NET/AJAX ...

随机推荐

  1. Mysql 关闭自动commit

    更多内容推荐微信公众号,欢迎关注: 1. 会话级关闭自动提交 mysql> set autocommit=off; Query OK, 0 rows affected (0.00 sec) my ...

  2. 查看Linux系统版本的几种方法

    第一种: cat /etc/os-release # 或者 cat /etc/redhat-release 结果如下: NAME="Ubuntu" VERSION="16 ...

  3. [转]计算机视觉之跟踪算法——相关滤波器Correlation Filter

    https://blog.csdn.net/victoriaw/article/details/62416759 ASEF相关滤波器: Average of Synthetic Exact Filte ...

  4. ip_local_deliver && ip_local_deliver_finish

    当ip包收上来,查路由,发现是发往本地的数据包时,会调用ip_local_deliver函数: ip_local_deliver中对ip分片进行重组,经过LOCAL_IN钩子点,然后调用ip_loca ...

  5. 三、springcloud之服务调用Feign

    一.背景 项目中接口调用: Httpclient Okhttp Httpurlconnection RestTemplate 微服务提供了更简单,方便的Feign 二.Feign简介 Feign是一个 ...

  6. MySQL字符集编码相关

    Windows 10家庭中文版,MySQL  5.7.20,2018-05-07 Part.1 查找数据库的字符集编码 查看MySQL字符集编码:status命令 使用命令行登录MySQL服务器,然后 ...

  7. Python3 出现'ascii' codec can't encode characters问题

    当使用urllib.request.urlopen打开包含中文的链接时报错: from urllib import request url = 'https://baike.baidu.com/ite ...

  8. 日期时间设置 "2018-05-04T16:36:23.6341371+08:00" 格式

    using System;using System.Collections.Generic;using System.Globalization;using System.Text; namespac ...

  9. phpStudy配置https

    phpStudy配置https 1.打开vhosts-conf配置文件 2.在配置文件中增加如下内容 server { listen 443; server_name tam.gogugong.com ...

  10. KVM virsh常用命令篇

    1.查看运行的虚拟机 virsh list 2.查看所有的虚拟机(关闭和运行的虚拟机) virsh list --all 3.连接虚拟机 virsh console +域名(虚拟机的名称) 4.退出虚 ...