2014-03-05 42 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(); 

然后返回更新的模型。