補上刪除,就完成了 CRUD 所有的功能。為了能返回特定的列表分頁,列表分頁通常用 Get 傳遞參數,而為了避免不慎點選連結而誤刪資料,資料刪除通常用 Post 傳遞參數。
在前幾篇「Kuick Hands on Labs -- 17. 列表與分頁」裡提及,列表的 HTML 裡額外加上幾個自定義的 attribute,包含 <table> 加上 EntityName 屬性,<tr> 加上 KeyValue 屬性,<td> 加上 ColumnName 屬性,目前的刪除資料功能裡就使用到這些自定義資料。
1. 列表資料增加刪除功能連結
刪除功能連結僅標註 remove 的 CSS:
<a class=\"remove\" href=\"#\">刪除</a>
列表頁建立傳遞刪除參數用的表單 removeForm:
<form id="removeForm" action="remove.aspx" method="post">
<input type="hidden" name="EntityName" id="removeEntityName" />
<input type="hidden" name="KeyValue" id="removeKeyValue" />
</form>
2. 點選連結觸發JavaScript處理
JavaScript 讀取所點選的刪除連結裡,往上層找直到找到第一個 <tr> 與 <table>,分別取出自定義屬性值 KeyValue 與 EntityName,經過操作者確認後 Post 刪除表單資料。
function getCloset(x, tag) {
var tags = x.parentsUntil(tag);
var tag = tags.length == 0
? x.parent()
: $(tags[tags.length - 1]).parent();
return tag;
}
$(function () {
// remove
$('.remove').bind(CONST.ClickEventName, function () {
var x = $(this);
var keyValue = getCloset(x, 'tr').attr('KeyValue');
var entityName = getCloset(x, 'table').attr('EntityName');
if (confirm("確定刪除 " + entityName + " 資料 " + keyValue)) {
$('#removeEntityName').val(entityName);
$('#removeKeyValue').val(keyValue);
$('#removeForm').submit();
}
});
});
3. 刪除功能頁
刪除頁有 3 個參數,EntityName 與 KeyValue 是必要參數,ReturnUrl 為選擇性參數,刪除資料的作法如下:
// EntityName
if(EntityName.IsNullOrEmpty()) {
Response.Redirect("~/", true);
}
// ReturnUrl
ReturnUrl = ReturnUrl.IsNullOrEmpty()
? "~/entity/?EntityName=" + EntityName
: ReturnUrl;
// KeyValue
if(KeyValue.IsNullOrEmpty()) {
Response.Redirect(ReturnUrl, true);
}
// Original
IEntity original = Entity.Get(EntityName, KeyValue);
if(null == original) {
Alert("沒有這筆資料");
JsRedirect(ResolveUrl(ReturnUrl));
}
// remove
DataResult result = original.Remove();
if(result.Success) {
Response.Redirect(ReturnUrl, true);
} else {
Alert(result.Message);
JsRedirect(ResolveUrl(ReturnUrl));
}
這裡操作刪除時,先選取該筆資料判斷是否存在再刪除,也可以直接使用主鍵刪除再判斷受影響的筆數是否為 1。
// 取出 Entity 規格定義
IEntity schema = EntityCache.Get(EntityName);
if(null == schema) {
Response.Redirect("~/", true);
};
// 不取資料,直接執行刪除指令
DataResult result = Entity
.Sql(EntityName)
.Where(schema.KeyName, KeyValue)
.Remove();
// 從回傳的結果物件判斷是否成功,並且加上判斷影響筆數條件
if(result.Success && result.AffectedCount == 1) {
Response.Redirect(ReturnUrl, true);
} else {
Alert(result.Message);
JsRedirect(ResolveUrl(ReturnUrl));
}