开发者社区> 科技小能手> 正文

jquery, json与ashx的完美结合

简介:
+关注继续查看

第一部分:客户端页面

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

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<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>
[WebService(Namespace = "http://tempuri.org/")]
[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; }

[DataMember]
public string Country { get; set; }

[DataMember]
public OrderItem[] Orders { get; set; }


}
[DataContract]
public class OrderItem
{
[DataMember]
public int OrderID { get; set; }
}

[DataContract]
public class ActionResult
{
[DataMember]
public int Code { get; set; }
[DataMember]
public string Message { get; set; }

}
}

第三部分:进一步的优化,编写两个扩展方法(这是C# 3.0的新特性) /// <summary>
/// 这个类型实现了对JSON数据处理的一些扩展方法
/// </summary>
public static class JsonExtensions
{
/// <summary>
/// 根据一个字符串,进行JSON的反序列化,转换为一个特定类型
/// </summary>
/// <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);
ms.Close();
return result;
}
/// <summary>
/// 将任何一个对象转换为JSON字符串
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="obj"></param>
/// <returns></returns>
public static string ToJsonString<T>(this T obj) {
var serializer = new DataContractJsonSerializer(typeof(T));
var ms = new MemoryStream();
serializer.WriteObject(ms, obj);
ms.Position = 0;
var result = Encoding.UTF8.GetString(ms.GetBuffer());
ms.Close();
return result;
}
} 这样,在ashx里面的代码就很简单了 var emp = context.Request["data"].ToJsonObject<Employee>();
var result = new ActionResult() { Code = 200, Message = "成功" };
context.Response.Write(result.ToJsonString());
不错吧,这样以后处理Json就是如此容易


通过Json来传递数据,可以避免以前用传统的post或者get方面拼接字符串中的麻烦


本文转自linzheng 51CTO博客,原文链接:http://blog.51cto.com/linzheng/1081648

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
18765 0
使用OpenApi弹性释放和设置云服务器ECS释放
云服务器ECS的一个重要特性就是按需创建资源。您可以在业务高峰期按需弹性的自定义规则进行资源创建,在完成业务计算的时候释放资源。本篇将提供几个Tips帮助您更加容易和自动化的完成云服务器的释放和弹性设置。
18358 0
如何设置阿里云服务器安全组?阿里云安全组规则详细解说
阿里云安全组设置详细图文教程(收藏起来) 阿里云服务器安全组设置规则分享,阿里云服务器安全组如何放行端口设置教程。阿里云会要求客户设置安全组,如果不设置,阿里云会指定默认的安全组。那么,这个安全组是什么呢?顾名思义,就是为了服务器安全设置的。安全组其实就是一个虚拟的防火墙,可以让用户从端口、IP的维度来筛选对应服务器的访问者,从而形成一个云上的安全域。
16618 0
阿里云服务器安全组设置内网互通的方法
虽然0.0.0.0/0使用非常方便,但是发现很多同学使用它来做内网互通,这是有安全风险的,实例有可能会在经典网络被内网IP访问到。下面介绍一下四种安全的内网互联设置方法。 购买前请先:领取阿里云幸运券,有很多优惠,可到下文中领取。
17972 0
windows server 2008阿里云ECS服务器安全设置
最近我们Sinesafe安全公司在为客户使用阿里云ecs服务器做安全的过程中,发现服务器基础安全性都没有做。为了为站长们提供更加有效的安全基础解决方案,我们Sinesafe将对阿里云服务器win2008 系统进行基础安全部署实战过程! 比较重要的几部分 1.
11505 0
使用NAT网关轻松为单台云服务器设置多个公网IP
在应用中,有时会遇到用户询问如何使单台云服务器具备多个公网IP的问题。 具体如何操作呢,有了NAT网关这个也不是难题。
34085 0
23705
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
OceanBase 入门到实战教程
立即下载
阿里云图数据库GDB,加速开启“图智”未来.ppt
立即下载
实时数仓Hologres技术实战一本通2.0版(下)
立即下载