2014-03-05 66 views
0

我有一個MVC視圖,顯示對象列表。在與顯示器1的列表中的對象被顯示左對齊,同時用顯示器2和父屬性1對象下的屬性1對象縮進:重新排列MVC視圖中的對象列表

property1-display1 
    property3-display2 
    property4-display2 
property2-display1 
    property5-display2 

我需要能夠手動更改內的這些項目的順序使用向上和向下箭頭按鈕相應的顯示級別,所以如果我將property1-display1向下移動,那麼property3-display2property4-display2將隨之下移。向上和向下按鈕回發給控制器,但是當用戶單擊保存按鈕時,列表僅發送到數據庫。

我的代碼寫在控制器中,但是當我嘗試做第二次移動時,模型回到原始狀態。

要求是用戶可以根據需要在頁面上更改任意數量的項目,但在用戶單擊「保存」按鈕之前,不應對列表順序進行任何更改。

我不知道爲什麼模型沒有正確更新。我曾嘗試禁用此控制器緩存:

[OutputCache(Duration = 0)] 

但這沒有什麼區別。

是重新排序列表中的代碼如下所示:

int targetIndex; 
var selected = model.ObjectList[index]; 
var orderNumber = selected.DisplayOrder; 
var items = 
    model.ObjectList.Where(
     x => x.ParentID == selected.ParentID).ToList(); 

// if the command is down, get the next lower id number, else get the next highest 
switch (direction) 
{ 
    case Constants.MOVE_DOWN: 

     var nextDown = items[items.IndexOf(selected) + 1]; 

     targetIndex = model.ObjectList.IndexOf(nextDown); 

     // set the display order for the item to move down. 
     model.ObjectList[index].DisplayOrder = 
      model.ObjectList[targetIndex].DisplayOrder; 

     // set the display order of the item to move up 
     model.ObjectList[targetIndex].DisplayOrder = 
      orderNumber; 

     break; 
    case Constants.MOVE_UP: 

     var nextUp = items[items.IndexOf(selected) - 1]; 

     targetIndex = model.ObjectList.IndexOf(nextUp); 

     // set the display order for the item to move down. 
     model.ObjectList[index].DisplayOrder = 
      model.ObjectList[targetIndex].DisplayOrder; 

     // set the display order of the item to move up 
     model.ObjectList[targetIndex].DisplayOrder = 
      model.ObjectList[index].DisplayOrder; 

     break; 
} 

// get all DisplayLevel 2 items 
var displayLevelObjects = 
    model.ObjectList.Where(x => x.DisplayLevel == 2) 
    .OrderBy(x => x.DisplayOrder) 
    .ToList(); 

// sort the list by DisplayOrder 
displayLevelObjects = displayLevelObjects.OrderBy(x => x.DisplayOrder).ToList(); 

var ObjectList = new List<PlanComparisonHeaderViewModel>(); 

// add children 
foreach (var item in displayLevelObjects) 
{ 
    var children = 
     model.ObjectList.Where(
      x => x.ParentID == item.ID).Distinct() 
      .OrderBy(x => x.DisplayOrder); 

    ObjectList.Add(item); 
    ObjectList.AddRange(children); 
} 

model.ObjectList = ObjectList; 

return View(model); 

任何建議表示讚賞。謝謝

+0

您是否在發佈到控制器後獲得新訂單值?你檢查過這些是否正確? –

+0

@OmriAharon是的,我第一次更改列表中的順序時,模型具有正確的值。這是第二次發佈訂單時出錯的時間。 – crunchy

+0

第二次,當請求到達控制器時,它們的值是否正確或者它們在那裏已經錯了? –

回答

0

這個答案其實很簡單(感謝我的同事傑森)。只需清除模型狀態:

ModelState.Clear(); 

然後返回更新的模型。