ASP.net jQuery調用webservice返回json數據的一些問題

来源:http://www.cnblogs.com/Aaxuan/archive/2017/04/06/6667357.html
-Advertisement-
Play Games

之前寒假時,試著使用jQuery寫了幾個非同步請求demo, 但是那樣是使用的webform普通頁面,一般應該是用 webservice 居多。 最近寫後臺管理時,想用非同步來實現一些信息的展示和修改, 這是第一次真正的在實際中運用ajax,卡了一個小時才做好簡單的信息展示。 在這之間遇到了兩個問題。寫 ...


之前寒假時,試著使用jQuery寫了幾個非同步請求demo,

但是那樣是使用的webform普通頁面,一般應該是用 webservice 居多。

最近寫後臺管理時,想用非同步來實現一些信息的展示和修改,

這是第一次真正的在實際中運用ajax,卡了一個小時才做好簡單的信息展示。

在這之間遇到了兩個問題。寫下來分享給大家,也加深一下自己的印象。

有錯誤的地方還請大神指出。

 

前端js代碼:

 1     <script type="text/javascript">
 2         $(function () {
 3             $("#details").hide();
 4             $(".details").click(function () {
 5                 showdetails($(this).attr("id"));
 6             });
 7         })
 8 
 9         function showdetails(id) {
10             $.ajax({
11                 url: "article.asmx/GetArticleByID",
12                 type: "POST",
13                 datatype: "json",
14                 data:'{ id: ' + id + ' }',
15                 contentType: "application/json; charset=utf-8",
16                 success: function (data) {
17                     var json = null;
18                     try {
19                         json = eval('(' + data.d + ')');
20                     }
21                     catch (e) {
22                         alert(e.message);
23                     }
24                     $("#id").text(json.ID);
25                     $("#title").text(json.Title);
26                     $("#time").text(json.Time);
27                     $("#text").text(json.Text);
28                     $("#details").show();
29                 }
30             });
31     </script>

前端html代碼

 1 //點擊的地方
 2 <td><a class="details" id="<% =Convert.ToInt32(article.ID) %>">詳細</a></td>
 3 
 4 //插入信息的地方
 5     <div id="details">
 6         <table>
 7             <tr>
 8                 <td id="id"></td>
 9                 <td id="title"></td>
10                 <td id="time"></td>
11                 <td id="text"></td>
12             </tr>
13         </table>
14     </div>

 

webservice 代碼

 1     [WebService(Namespace = "http://tempuri.org/")]
 2     [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
 3     [System.ComponentModel.ToolboxItem(false)]
 4     // 若要允許使用 ASP.NET AJAX 從腳本中調用此 Web 服務,請取消註釋以下行。 
 5     [System.Web.Script.Services.ScriptService]
 6     public class article : System.Web.Services.WebService
 7     {
 8 
 9         [WebMethod]
10         public string GetArticleByID(int id)
11         {
12             ArticleBLL article = new ArticleBLL();
13             article = ArticleBLL.GetArticleByID(id);
14 
15             //string s = string.Empty;
16             //s = "{\"id\":\""+article.ID+"\",\"title\":\""+article.Title+"\",\"text\":\""+article.Text+"\",\"time\":\""+article.Time+"\"}";
17             //return s;
18 
19             JavaScriptSerializer js = new JavaScriptSerializer();
20             return js.Serialize(article);
21 
22             //Context.Response.Write(s);
23             //Context.Response.End();
24         }
25     }

 

遇到的第一個問題是,傳遞信息時的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

轉載請保留出處。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • win7下安裝Ubuntu後進不去win7的解決方法 剛剛給同學在win7下安裝了Ubuntu16.04,結果在安裝完後竟然無法在電腦重啟後,找到win7的進入選項。 在網上找了找,都不行!就差點重裝了。終於還是找到了! 安裝Ubuntu後直接進入Ubuntu系統, "Ctrl+alt+t" 進入終 ...
  • 解決 Bash On Windows "無法從 Windows 應用商店下載。請檢查網路連接。"的問題 Fiddler和Bash On Windows 源離線壓縮包:http://pan.baidu.com/s/1kVofL4b 不想從百度網盤下載的,可以從官方下載: Fiddler:https:/ ...
  • 作業: 集群搭建 1、部署nginx反向代理三個web服務,調度演算法使用加權輪詢; 2、所有web服務使用共用存儲nfs,保證所有web都對其有讀寫許可權,保證數據一致性; 一、nginx服務 1. 先安裝yum install epel-release -y 2.安裝後發現沒有epel源,重新安裝一 ...
  • C#中遍歷各類數據集合的方法總結: 1.枚舉類型 2.遍歷ArrayList(Queue、Stack) 這裡以string為例,當然ArrayList中的元素可以是任何數據類型,遍歷時須確認ArrayList中的元素都是同一數據類型。 此外遍歷Queue隊列和Stack堆棧的方式與ArrayList ...
  • 三年前寫過基於ConcurrentQueue的非同步隊列,今天在整理代碼的時候發現當時另外一種實現方式-使用BlockingCollection實現,這種方式目前依然在實際項目中使用。關於BlockingCollection的基本使用請查閱MSDN。源碼實現 下麵直接上代碼:(代碼已經放到了我的git ...
  • 抱歉問題解決前沒留截圖,總之就是使用巨集相關的功能都打不開,會彈窗報錯,英文,大意是【一個或多個組件不存在,請嘗試重裝】。 嘗試過: 修複安裝VS2010 按此文照做:https://visualstudioextensions.vlasovstudio.com/2014/02/13/visual-s ...
  • 在 UWP 開發中,我們在進行數據綁定時,除了可以使用傳統的綁定 Binding,也可以使用全新的 x:Bind,由於後者是在程式編譯時進行初始化操作(不同於 Binding,它是在運行時創建、初始化),所以我們可以稱 x:Bind 為編譯型綁定,正像本文標題一樣。之所以引入 x:Bind,是因為它 ...
  • 本章的內容來源是有朋友咨詢怎麼做微信公眾號信息的收發消息功能,因此本著為社區做貢獻的態度申請了個人公眾號,然後嘗試對接了一下接收公眾號內容信息的流程;要說對接其實呢也算不上,因為個人賬號只有簡單的一些接收,被動回覆等功能信息,不能群發和使用客服介面,所以本章主要分享的是怎麼接受信息和被動發送回覆信息 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...