jquery ajax,ashx,json用法小结

          

 

jquery提供的简化版的ajax调用方法通常如下:

function post() {    

$("#divWait").show();

    $("#btnPost").attr("disabled", "disabled");   

  $.post("../PostIt.ashx",          

           {      

                   msgContent: $("#msgContent").val()           

          },     

                function (data) {           

              if (data.indexOf('OK') > -1) {       

                      alert(data);       

                  }                

               else {

                        }       

                  $("#divWait").hide();

                   $("#btnPost").attr("disabled", "");

                    });

}

在开发的时候,要接受json格式的返回值时,上面的方法貌似不能行,上面的方法貌似接受的是text的文本行。

因此,采用jQuery的底层Ajax实现方法。

该方法参数也很多,具体可看帮助文档。

本人的常规用法

function doPostAjax(){

            $("#divWait").show();

            $("#btnPost").attr("disabled", "disabled");

            $.ajax({

                url: '../PostIt.ashx',

                type: 'POST',

                dataType: 'json',

                data: { msgContent: $("#msgContent").val() },

                timeout: 60000,

                error: function (XMLHttpRequest, textStatus, errorThrown) {//请求错误 时执行的方法

                    alert("error!" + errorThrown);

                    $("#divWait").hide();

                    $("#btnPost").attr("disabled", "");

                },

                success: function (data, txtSataus) {//请求成功时执行的方法

                    showContent(data.content, data.createdate);

                    $("#divWait").hide();

                    $("#btnPost").attr("disabled", "");

                }

            });

        }

 

在ashx代码段,要设置好返回的格式。

context.Response.ContentType = "application/json";

如果是返回的html或者text的话可以如下写法

context.Response.ContentType = "text/plain";

如果ajax方法中设置的返回值是json时,ashx代码返回的格式必须是json格式的数据。

把一个对象转换成json格式,常用方法就是采用开源的第三方类库json.net,Newtonsoft.Json.dll.

JsonConvert.SerializeObject方法就可以转换了。返回json格式后,jquery就可以采用XXX.xxx的方式获取值了。

JsonConvert在处理datetime格式的时候,会返回类似1198908717056的绝对值,因此,在处理datetime的时候,要做一下转换。具体语句如下:

IsoDateTimeConverter timeConverter = new IsoDateTimeConverter();

           //这里使用自定义日期格式,如果不使用的话,默认是ISO8601格式

            timeConverter.DateTimeFormat = "yyyy'-'MM'-'dd' 'HH':'mm':'ss"; string output = JsonConvert.SerializeObject(m, Newtonsoft.Json.Formatting.Indented, timeConverter);

此处顺便提一下,javascript对json格式的数据有着天生的处理能力,非常好的兼容json格式数据。

举个例子:

function pppp() {

           var person = { "name": "jack", "age": 24,"sex": true };

           alert(person.name);

           alert(person.age);

           alert(person.sex);

           }

这样的代码可以直接写出来,在vs2010的代码编辑器中还可以有代码提示。很强大。

ashx完整代码如下:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Threading;

using Newtonsoft.Json;

using Newtonsoft.Json.Converters;

namespace nnn {

    /// <summary>

    /// PostIt 的摘要说明

    /// </summary>

    public class PostIt : IHttpHandler     {

        public void ProcessRequest(HttpContext context)

        {

            context.Response.ContentType = "application/json";

            try

            {

                string msgContent = context.Request["msgContent"] ?? "";

                ModelContent m = new ModelContent()

                {

                    author = "",

                    categoryid = -1,

                    title = "",

                    content = msgContent,

                    datetime = DateTime.Now,

                    key = "",

                    createdate = DateTime.Now,

                    lastmodifydate = DateTime.Now,

                    ip = context.Request.UserHostAddress

                };

                //BLLContent bll = new BLLContent();

                //bll.Add(m);

                IsoDateTimeConverter timeConverter = new IsoDateTimeConverter();

                          //这里使用自定义日期格式,如果不使用的话,默认是ISO8601格式

                           timeConverter.DateTimeFormat = "yyyy'-'MM'-'dd' 'HH':'mm':'ss";

                string output = JsonConvert.SerializeObject(m, Newtonsoft.Json.Formatting.Indented, timeConverter);

                context.Response.Write(output);

            }

            catch (Exception ex)

            {

                context.Response.Write(ex.Message);

            }

        }

        public bool IsReusable

        {

            get

            {

                return false;

            }

        }

    }

}

posted @ 2014-05-08 22:52  x_window  阅读(122)  评论(0)    收藏  举报