呼叫 WebService :可用 JSON 或 Key:Value 傳送Form的欄位。
如果用 return 回傳值,則dataType 要設成 "json"
如果用 HttpContext.Current.Response.Write 回傳值,則 dataType 設成 "html" 或 "text"
呼叫 PageMethod:只能用 JSON 傳送 Form 欄位。
只可用 return 回傳值,且dataType 要設成 "json",否則會收到字串形態的 JSON 物件
呼叫網頁(ASPX):只能用 key:value 傳送 Form 的欄位。
只可用 HttpContext.Current.Response.Write 回傳值,則 dataType 設成 "html" 或 "text"
壹、配合 JSON 呼叫 WebService (ASMX)
處理結束之後,會用 return 返回處理結果,返的資料$.ajax({
url: 'user.asmx/checkLogin',
type: 'POST',
async: false,
data: JSON.stringify({userId:'12345', password:'12345'}),
contentType:'application/json; charset=UTF-8',
dataType:"json", //如果要回傳值,請設成 json
error: function(xhr) {//發生錯誤時之處理程序 },
success: function(reqObj) {//成功完成時之處理程序 }
});
底下是 user.asmx 的後端程式碼
using System; using System.Web; using System.Web.Services; using System.Web.Security; using System.Web.Services.Protocols; using System.Collections.Generic; using System.Web.Configuration; using System.Text.RegularExpressions; [WebService(Namespace = "http://SSO_Portal.moj.tw/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] // 若要允許使用 ASP.NET AJAX 從指令碼呼叫此 Web 服務,請取消註解下一行。 [System.Web.Script.Services.ScriptService] public class SSO_Service : System.Web.Services.WebService { [WebMethod(EnableSession = true)] [System.Web.Script.Services.ScriptMethod] public string[] checkLogin(string userID, string password, string grCode) { UserData user=new UserData(); HttpContext.Current.Response.Redirect("Default.aspx"); return null; } }
貳、配合 JSON 呼叫 PageMethod
處理結束之後,會用 return 返回處理結果,返的資料$.ajax({
url: 'checkLogin.aspx/chkUser',
type: 'POST',
async: false,
data: JSON.stringify({userId:'12345', password:'12345'}),
contentType:'application/json; charset=UTF-8',
dataType:"json", //如果要回傳值,請設成 json
error: function(xhr) {//發生錯誤時之處理程序 },
success: function(reqObj) {//成功完成時之處理程序 }
});
底下是 checkLogin.aspx 的 chkuser 後端程式碼
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Security;
namespace mySpace
{
public partial class checkLogin : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
[WebMethod(EnableSession = true)]
public static string chkUser(string userID, string grCode, string password)
{
string aaaa = "";
// string uid=HttpContext.Current.Request.Form["userID"]; //收不到值
// string pwd = HttpContext.Current.Request.Form["password"];
// HttpContext.Current.Response.Redirect("Default.aspx"); //會出錯
return null;
}
}
}
參、直接 POST 給另一個網頁(ASPX)
直接在處理的網頁內,用 Response 返回資料內容$.ajax({
url: 'checkLogin.aspx',
type: 'POST',
async: false,
data: {userId:'12345', password:'12345'},
contentType:'application/x-www-form-urlencoded; charset=UTF-8',
//如果使用 "application/json; charset=utf-8" ,則後端程式無法
//用 Request.Form["..."] 來取得傳送過來的資料
dataType:"html", //或用 "text"
//如果不指定 dataType,會造成 jQuery 剖析時錯誤,所以會觸發 error
error: function(xhr) {//發生錯誤時之處理程序 },
success: function(reqObj) {//成功完成時之處理程序 }
});
底下是 checkLogin.aspx 的後端程式碼
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Security;
namespace mySpace
{
public partial class checkLogin : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
String userid = this.Request.Form["userId"];
String pwd = this.Request.Form["password"];
this.Response.Write("Return Value"); //要返回的文字
this.Response.Redirect("Default.aspx");
//會把整個 Default.aspx 的html內容回傳,而不是執行轉向作業!
Server.Transfer("default.aspx");
//會把整個 Default.aspx 的html內容回傳,一樣不會執行轉向作業!
}
}
}
說明:
jQuery 的 contentType 對不同後端程式的影響| application/x-www-form-urlencoded | application/json | |
| 對WebService |
|
|
| 對ASPX網頁 |
|
|
| 對 PageMethod | 不能使用這種方式呼叫 PageMethod,否則會變成是 Post 到 ASPX,反而執行 Page_Load,而忽略指定的 PageMethod |
|
jQuery.ajax() 的一般重要參數設定
async:true 是否採 非同步 呼叫,跨網域呼叫 及 dataType:"jsonp" 不支援 同步呼叫
beforeSend:function(jqXHR, settings){} 執行ajax之前先執行此callback程序,例如更改檔頭、 如果返回 false ,就會中止 ajax
cache:true | false
complete:function(jqXHR, textStatus){} 在 success 或 error 之後執行
txtStatus 可能為 "success", "notmodified", "error", "timeout", "abort", or "parsererror"
contents: 指明針對後端回傳的資料, jQuery 要如何剖析? ????
contentType:
"application/x-www-form-urlencoded; charset=UTF-8" 用一般文字對傳送參數
"application/json; charset=utf-8" 用 json 物件傳送參數
converts: ????dataType-to-dataType converters
{"* text": window.String, "text html": true, "text json": jQuery.parseJSON, "text xml": jQuery.parseXML}
crossDomain: false 是否允許跨網域 呼叫
data: {key:value, key:value} 要傳送的資料
dataFilter: function(String data, String dataType) 如何處理由後端回傳的原始資料
dataType:"xml", "json", "script", "html", "jsonp" 指明回傳資料的形態,預設是由 jQuery 自行判斷
scriptChartset: 只針對 dataType 設成 script 或 jsonp 是指定其內碼字集
error:function(jqXHR jqXHR, String textStatus, String errorThrown )
headers:{key:value, key:value} request 時,加入額外的表頭資訊
processData:true 預設 data: 選項的資料是會依照 contentType 進行轉換,如果不想轉換可將 processData 設為 false
success:function(PlainObject data, String textStatus, jqXHR jqXHR )
timeout:N 設定 timeout 的時間(毫秒)
type: "GET" 或 "POST" ("PUT", "DELETE" 也可使用但不一定有作用)
謝謝分享,一直沒手工刻過ajax 及asp.net的呼叫,日後實作時再跟您請教。
回覆刪除