天天看點

jquery, json與ashx的完美結合

第一部分:用戶端頁面

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm3.aspx.cs" Inherits="WebApplication1.WebForm3" %>

<head runat="server">

<title></title>

<script src="jquery-1.3.2-vsdoc.js" type="text/javascript"></script>

<script src="json2.js" type="text/javascript"></script>

<script type="text/javascript">

$(function() {

//構造一個json對象,很類似于C#中的匿名類型

var employee = {

Name: "chenxizhang",

Country: "China",

Orders: [

{ OrderID: 10248 },

{ OrderID: 10249 }

]

};

//發送POST請求,資料也是json格式。但數值部分需要轉換為字元串

$.post("EmployeeHandler.ashx", { data: JSON.stringify(employee) }, function(result) {

var r = JSON.parse(result);

alert(r.Message);

});

</script>

</head>

<body>

<form id="form1" runat="server">

<div>

</div>

</form>

</body>

</html>

第二部分:ashx部分

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Web.Services;

using System.Runtime.Serialization.Json;

using System.Runtime.Serialization;

using System.IO;

using System.Text;

//必須添加System.ServiceModel.Web和System.Runtime.Serialization的引用

namespace WebApplication1

{

/// <summary>

/// $codebehindclassname$ 的摘要說明

/// </summary>

[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]

public class EmployeeHandler : IHttpHandler

public void ProcessRequest(HttpContext context)

var ser = new DataContractJsonSerializer(typeof(Employee));

var data = context.Request["data"];

var ms = new MemoryStream(Encoding.UTF8.GetBytes(data));

var emp = (Employee)ser.ReadObject(ms);

ms.Close();

//此時已經得到了相應的Employee執行個體,可以進行伺服器端的處理

var ser2 = new DataContractJsonSerializer(typeof(ActionResult));

var ms2 = new MemoryStream();

var result = new ActionResult() { Code = 200, Message = "成功" };

ser2.WriteObject(ms2, result);

ms2.Position = 0;

var buffer = new byte[ms2.Length];

ms2.Read(buffer, 0, buffer.Length);

ms2.Close();

context.Response.Write(Encoding.UTF8.GetString(buffer));

//傳回結果

}

public bool IsReusable

get

return false;

[DataContract]

public class Employee {

[DataMember]

public string Name { get; set; }

public string Country { get; set; }

public OrderItem[] Orders { get; set; }

public class OrderItem

public int OrderID { get; set; }

public class ActionResult

public int Code { get; set; }

public string Message { get; set; }

第三部分:進一步的優化,編寫兩個擴充方法(這是C# 3.0的新特性) /// <summary>

/// 這個類型實作了對JSON資料處理的一些擴充方法

public static class JsonExtensions

/// 根據一個字元串,進行JSON的反序列化,轉換為一個特定類型

/// <typeparam name="T"></typeparam>

/// <param name="data"></param>

/// <returns></returns>

public static T ToJsonObject<T>(this string data) {

var serializer = new DataContractJsonSerializer(typeof(T));

var ms = new MemoryStream(

Encoding.UTF8.GetBytes(data));

var result = (T)serializer.ReadObject(ms);

return result;

/// 将任何一個對象轉換為JSON字元串

/// <param name="obj"></param>

public static string ToJsonString<T>(this T obj) {

var ms = new MemoryStream();

serializer.WriteObject(ms, obj);

ms.Position = 0;

var result = Encoding.UTF8.GetString(ms.GetBuffer());

} 這樣,在ashx裡面的代碼就很簡單了 var emp = context.Request["data"].ToJsonObject<Employee>();

context.Response.Write(result.ToJsonString());

不錯吧,這樣以後處理Json就是如此容易

通過Json來傳遞資料,可以避免以前用傳統的post或者get方面拼接字元串中的麻煩

本文轉自linzheng 51CTO部落格,原文連結:http://blog.51cto.com/linzheng/1081648

繼續閱讀