所以我寫了一個void來處理咕嚕聲。由於我需要使用多種類型的實體進行此操作,所有這些實體都有一個SortOrder
列,因此我創建了一個名爲ISortable
的界面,其中包含一個SortOrder
列。如果你只是用一個數據庫表來做這件事,你可以用ISortable
的任何實例替換任何實體命名的實例。
什麼需要這樣的空隙之外發生的情況是:
從數據庫中獲取您的項目,它的老排序順序存儲在一個變量(oldSortOrder
),然後設置你的項目的新的排序順序(newSortOrder
)然後將變量設置爲不是您剛更新的其他項目(list
)。這也解釋了從數據庫中刪除的項目,只需在您的ajax調用中設置newSortOrder
到0
即可。
的WebAPI方法:
// Code is activated when accessed via http PUT
public void PutItem(int itemId, int newSortOrder)
{
// using makes sure Context is disposed of properly
using (var Context = new MyDbContext())
{
var oldSortOrder = 0;
IEnumerable<ISortable> itemsToReorder = null;
// Get moved item from database
var item = Context.Items.FirstOrDefault(x => x.ItemId == itemId);
// Before we set the new sort order, set a variable to the
// old one. This will be used to reorder the other items.
oldSortOrder = item.SortOrder;
// Get all items except the one we grabbed above.
itemsToReorder = Context.Items.Where(x => x.ItemId != itemId);
// Delete if the item is set for deletion (newSortOrder = 0)
if (newSortOrder == 0)
{
Context.Items.Remove(item);
}
// Otherwise, set the new sort order.
else
{
item.SortOrder = newSortOrder;
}
// Pass other items into reordering logic.
ReOrder(itemsToReorder, oldSortOrder, newSortOrder);
// Save all those changes back to the database
Context.SaveChanges();
}
}
重新排序無效:
public static void ReOrder(IEnumerable<ISortable> list,
int oldSortOrder,
int newSortOrder)
{
IEnumerable<ISortable> itemsToReorder;
// Pare down the items to just those that will be effected by the move.
// New sort order of 0 means the item has been deleted.
if (newSortOrder == 0)
{
itemsToReorder = list.Where(x => x.SortOrder > oldSortOrder);
}
else
{
// This is just a long inline if statement. Applies Where()
// conditions depending on the old and new sort variables.
itemsToReorder = list.Where(x => (oldSortOrder < newSortOrder
? x.SortOrder <= newSortOrder &&
x.SortOrder > oldSortOrder
: x.SortOrder >= newSortOrder &&
x.SortOrder < oldSortOrder));
}
foreach (var i in itemsToReorder)
{
// Original item was moved down
if (newSortOrder != 0 && oldSortOrder < newSortOrder)
{
i.SortOrder -= 1;
}
// Original item was moved up
else if (newSortOrder != 0 && oldSortOrder > newSortOrder)
{
i.SortOrder += 1;
} // Original item was removed.
else
{
i.SortOrder -= 1;
}
}
}
讓我知道如果你需要一些澄清。我幾乎肯定我沒有充分解釋一切。
我以前用Entity Framework做過這種事情。它需要在SQL中嗎? –
@BlakeRivell,請指定你使用哪個SQL服務器? – AlexK
@dans是的我使用的是實體框架我只是假設某人用SQL來描述我最簡單。我正在使用kendo UI排序小部件,它允許我在列表視圖中拖放圖像,並且onChange可以訪問移動項目的oldIndex和newIndex。我的計劃是在此時進行ajax調用,以更新所有記錄排序順序。 –