推薦這個blog:

Award


(ASP.NET 2010、2011、2012年)

其他資源

簡體中文blog

最新回應

前言
如同標題的關鍵字一般,『jQuery, Ajax, aspx, JSON』,這一篇文章用個簡單的範例來說明這幾個東西怎麼串起來。

需求與步驟

  1. Sample.aspx上按一個HTML Button。
  2. 用GET方式,向JSON.aspx發送Request。
  3. JSON.aspx回傳的資料格式需轉成JSON。
  4. Ajax接到回傳的JSON資料後,呈現在<div>裡面。

 

Sample Code

1. Sample.aspx:
(1)使用$.ajax
(2)使用GET方式呼叫aspx
(3)Ajax成功時,使用$.parseJSON來把data字串轉成array
(4)使用$.each()將每一個element組成html。(這邊可以先組好html,再做一次塞給#result)

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <script src="//code.jquery.com/jquery-1.6.1.js" type="text/javascript"></script>
    <script type="text/javascript">
        $(document).ready(function () {
            $('#btnTrigger').bind('click', function () {
                $.ajax(
            {
                type: "GET",
                url: "Json.aspx",
                success: function (data) {
                    var myarray = $.parseJSON(data);
                    $.each(myarray, function (i, item) {
                        var content = "index:" + i + "; Name: " + item.Name + "; Id: " + item.Id;
                        var li = "<li>" + content + "</li>";
                        $('#result').append(li);
                    });
                }
            });
            });
        });

    </script>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <input id="btnTrigger" type="button" value="trigger ajax" />
        <div>
            <ul id="result">
            </ul>
        </div>
    </div>
    </form>
</body>
</html>

 

2.JSON.aspx:

(1)若使用aspx來回傳,請將.aspx上的所有html移除,只留下第一個Page指示詞就好。

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Json.aspx.cs" Inherits="Json" %>

 

3.JSON.aspx.cs:

(1)在Page_Load裡面(其實可以在Page_Init,應該會更快一點點)。
(2)透過JavaScriptSerializer來將要回傳的集合序列化成JSON格式。
(3)透過Response.Write()來回傳資料。
(4)回傳完資料,呼叫Response.End()結束這個Request。

public partial class Json : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        JavaScriptSerializer serializer = new JavaScriptSerializer();
        var responseEntities = new List<Person>()
        {
            new Person{ Name="Joey1", Id="Id1"},
            new Person{ Name="Joey2", Id="Id2"}
        };

        var result = serializer.Serialize(responseEntities);
        Response.Write(result);
        Response.End();
    }
}
public class Person
{
    public string Name { get; set; }
    public string Id { get; set; }
}

結果畫面

image


結論
這麼簡單的範例,就是為了凸顯一些基本觀念的應用。希望對那些還不熟悉jQuery, ajax, JSON的朋友,能有所幫助。能幫助他們不再被postback綁住。

Source Code:JSON.zip


點部落-In Joey

↑ Grab this Headline Animator


關連文章

[ASP.NET]套用MasterPage後,如何動態新增控制項

[jQuery]透過jQuery Template把JSON資料套入範本

[.NET]在List.Add()時,請了解加入的item是參考位址

[ASP.NET]用Linq取CheckBoxList選取項目的值

回應

  • # re: [ASP.NET]透過jQuery的Ajax,呼叫server端的aspx,回傳JSON格式的資料 by 呂高旭

    NICE 

    2011/11/22 下午 08:32 | 回覆

  • # re: [ASP.NET]透過jQuery的Ajax,呼叫server端的aspx,回傳JSON格式的資料 by 91

    to 呂高旭 :

    謝謝老師的稱讚!期待老師的大作 :)

    2011/11/22 下午 08:39 | 回覆

  • # re: [ASP.NET]透過jQuery的Ajax,呼叫server端的aspx,回傳JSON格式的資料 by KKMAN

    我要第一個報名被救出psotback火海的門徒之一。

    好文章!!

    不過,小弟一問。

    請問類似的狀況,可以使用.ashx來代替.aspx嗎?是否會更為適合!?

    2011/11/22 下午 09:12 | 回覆

  • # re: [ASP.NET]透過jQuery的Ajax,呼叫server端的aspx,回傳JSON格式的資料 by 91

    to KKMAN :

    沒錯,我也比較習慣用.ashx。

    這一篇文的範例,用.aspx的原因是:

    1.這一篇msdn forum的發問:http://social.msdn.microsoft.com/Forums/zh-TW/236/thread/acea26c0-fd23-4517-8ef7-b68fe66f6687

    2.很多人用.aspx來當server端的http handler,卻沒有把.aspx上面的html清掉,導致response回來的資料不只是response.write的資料,而是夾雜了一堆html。

     

    2011/11/22 下午 09:29 | 回覆

  • # re: [ASP.NET]透過jQuery的Ajax,呼叫server端的aspx,回傳JSON格式的資料 by topcat

    當跨網域的時候,再來個JSONP

    http://www.dotblogs.com.tw/topcat/archive/2011/09/21/37024.aspx

    ^_^

    2011/11/22 下午 11:20 | 回覆

  • # re: [ASP.NET]透過jQuery的Ajax,呼叫server端的aspx,回傳JSON格式的資料 by 91

    to topcat :

    之前還沒碰到用JSONP的需求耶,所以JSONP的概念,就跟jQuery CDN一樣嗎?
     

    2011/11/22 下午 11:29 | 回覆

  • # re: [ASP.NET]透過jQuery的Ajax,呼叫server端的aspx,回傳JSON格式的資料 by jurio

    前端js組html字串,後端也許是c#/vb組sql字串
    綁住...

    2011/11/23 上午 08:16 | 回覆

  • # re: [ASP.NET]透過jQuery的Ajax,呼叫server端的aspx,回傳JSON格式的資料 by 91

    to jurio :

    不是很懂您的意思。

    前端js組html字串的部份,後面我想帶出jQuery Template的應用。但不希望一篇東西裡面,塞太多概念,所以想要循序漸進的鋪路。

    至於後端我就不懂您要說的是什麼了。對我來說,後端是ADO.NET, stored procedure, NHibernate, EF, 甚至web service, WCF,完全無所謂囉,反正對用的人來說,只看的到介面。
     

    2011/11/23 上午 09:52 | 回覆

  • # re: [ASP.NET]透過jQuery的Ajax,呼叫server端的aspx,回傳JSON格式的資料 by topcat

    to 91 :

    JSONP的概念其實是一種使用JSON但轉個彎的做法

    1.Ajax取遠端的資料,無論是否用JSON格式,都無法跨網域

    2.網頁可以跨網域引用遠端的JS Library來使用

    結合1.2.就是JSONP的精神,跨網域去啟動遠端的程式,想把資料帶回去,但是不能

    所以把動態產生的JS Library裡面,塞了JSON的資料在裡面,讓他搭便車回去,順便叫起呼叫端的function起來做事情。

    大概就是這樣。

    ^_^

    2011/11/23 上午 11:06 | 回覆

  • # re: [ASP.NET]透過jQuery的Ajax,呼叫server端的aspx,回傳JSON格式的資料 by 小黑

    91 哥,好威

    2011/11/23 上午 11:40 | 回覆

  • # re: [ASP.NET]透過jQuery的Ajax,呼叫server端的aspx,回傳JSON格式的資料 by KKMAN

    to 91 :
    哈~果然是91大。

    我當初就是犯過你說第二點的那種錯誤,還找老半天原因。

    後來就改成.ashx了!!

    2011/11/23 下午 11:44 | 回覆

  • # re: [ASP.NET]透過jQuery的Ajax,呼叫server端的aspx,回傳JSON格式的資料 by 湯米吳

    2.很多人用.aspx來當server端的http handler,卻沒有把.aspx上面的html清掉,導致response回來的資料不只是response.write的資料,而是夾雜了一堆html。

    關於這個我有個疑問 當 .aspx 是 url 與 .cs是同一page可以取到server端的值

    但是 如果url是不同的 page  就會有 上述的問題存在

     

    2012/2/20 下午 02:41 | 回覆

  • # re: [ASP.NET]透過jQuery的Ajax,呼叫server端的aspx,回傳JSON格式的資料 by 91

    to 湯米吳 :

    自己這一頁,就是PageMethod囉。
     

    2012/2/20 下午 02:49 | 回覆

  • # re: [ASP.NET]透過jQuery的Ajax,呼叫server端的aspx,回傳JSON格式的資料 by 湯米吳

    to 91 :
    我比較好奇的是他運作的機制!

    為何同一頁的PageMethod可以用

    但是其他頁面的就會出錯

     $.ajax({
                    type: "POST",
                    url: "frmJQueryAjax.aspx/GetCalenderRemark",   //(我指的是這裡)
                    contentType: "application/json; charset=utf-8",
                    dataType: "json",
                    data: "{'country':'" + atced_country_.val() + "','date':'" + date + "'}",
                    success: function (data) {
                        atced_comment_.val(data.d);
                    },
                    error: function (err) {
                        alert("error");
                    }
                });

     

    2012/2/20 下午 03:05 | 回覆

登入後使用進階評論

Please add 5 and 6 and type the answer here: