zoukankan      html  css  js  c++  java
  • jquery, json与ashx的完美结合

    AJAX的应用程序,免不了经常需要在页面和服务之间异步传输数据。我已经多次写过这方面的东西。下面还是有一个比较经典的案例,我认为掌握到这些,那么处理异步请求的时候就相当方便了。

    第一部分:客户端页面

    <%@ 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方面拼接字符串中的麻烦

  • 相关阅读:
    前端之css样式(选择器)
    html 之表单,div标签等
    前端基础之html
    【动态规划】【背包模板】
    【dp专题1】F
    【dp专题1】B
    hdu 1171 Big Event in HDU 01背包
    HDU 2048 数塔 简单DP
    练习赛2(补题)问题 G: 建设电力系统【最小生成树kruskal模板题】
    【图论】【最小生成树】【kruskal+prime】
  • 原文地址:https://www.cnblogs.com/chenxizhang/p/1659979.html
Copyright © 2011-2022 走看看