AJAX與PageMethod
從懵懵懂懂的ASP到開始嘗試寫.NET
這段的心路歷程
從一開始的AutoPostBack好神奇, 好好用, 好簡單
到後來的痛苦深淵, 網站瀕臨崩潰邊緣
接著的諄諄教誨, 寫程式的時候東注意西注意
定了許多的規範
就是怕又做出一個失控的VIEWSTATE
試了很多方法, WebService, PageMethod 等
後來選定了也習慣了用jQuery AJAX與 Page Method的溝通模式
在這邊留做筆記
TestPage.aspx.cs
using System.Web.Script.Services;
[System.Web.Services.WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public static AjaxData Delete(int itemId)
{
FeatureBaseDb db = new FeatureBaseDb();
Feature item = db.Get(itemId);
bool bSuccess = db.Delete(item);
}
TestPage.aspx
val itemId = $('#ddlItem').val(); //或其他來源
$.ajax({
url: 'TestPage.aspx/Delete', type: 'POST', dataType: 'json',
contentType: 'application/json; charset=utf-8',
data: $.toJSON({ itemId: itemId }),
success: function (data) {
if (data.d.result)
alert('Save Success!');
else
alert('Save Failed!');
}
});
(除了要匯入jQuery外還需要匯入jQuery JSON才可正常運作)
簡單來說, 在Page Code Behind將Method宣告為static
並且加上WebMethod的標籤
.NET就會把這個FUNCTION宣告為PAGE METHOD
就可以在JavaScript用 {PageName}.aspx/{Method Name}的方式呼叫
並且互相溝通, 與回傳值
這邊網路上可以找到很多的資訊
下面附上我主要用來跟JavaScript溝通的資料格式
/// <summary>
/// 自訂Ajax Call標準的回傳格式
/// </summary>
/// <typeparam name="T"></typeparam>
public class AjaxData<T>
{
public AjaxData(T obj)
{
data = obj;
}
/// <summary>
/// 執行結果 true/ false
/// </summary>
public bool result { get; set; }
/// <summary>
/// 額外回傳給client的訊息,例如錯誤訊息等...
/// 可以用html
/// </summary>
public string message { get; set; }
/// <summary>
/// 實際要回傳的資料
/// </summary>
public T data { get; set; }
}
這個架構可以用在大部分的結構上
並且回傳給 AJAX的success去處理
讓他判斷這次的動作是否成功 (result), 以及傳了什麼樣的訊息回來(message)
若有其他動作也可以把物件放入data
但是看ajax code可以看到一調
if ( data.d.result )
在VS 2005之後, Page Method加上Json標籤後回傳的物件都會在用一個d包起來
格式像是
{ d : { (真正的物件) } }
因此要加一個.d才能正常的取到值
( 其實我不是很清楚分界點在哪, 在前幾年的專案試圖用這種語法, 發現後台傳的是什麼前台接到的就是什麼
但是在新版的Visual Studio, 會發現回傳的格式多了一層 d )
其實使用JavaScript跟Server端的程式溝通的方法很多
我會挑選這個方法主要是因為寫的方式很直覺, 不用組字串或是拆解
可以直接用物件的方式取直並且寫程式 對於新手也比較好上手
關鍵點就在 [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
這一行上面
下一篇再做進一步的說明 (自以為詳細 說不定錯誤百出 orz)
--
本文可能有理解錯誤 或不盡不實的地方
請路過的前輩不要客氣 用力打醒
這會是我們成長的主要養分