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;
}
}
}
}
本文出自 “一隻部落格” 部落格,請務必保留此出處http://cnn237111.blog.51cto.com/2359144/695900