2016-03-22 17 views
0

例如,如果您想重新排列問題列表,並且讓最後一個問題移動,那麼在我做的所有事情之前的問題就是密鑰的價值,但在我看來,我是錯誤的,證明你收到此消息:跳到一年級列表

「System.InvalidOperationException」類型的異常出現在EntityFramework.dll但

其他信息未在用戶代碼來處理:該物業「ID」是的一部分該對象的關鍵信息無法修改。

public ActionResult Up(int id , string st) 
{ 
    var qus = db.Qusetions.Find(id); 

    if(st == "up") 
    { 
     if(qus.ID != 1) 
     { 
      qus.ID = -1; 
      var qusup = db.Qusetions.SingleOrDefault(q => q.ID == q.ID - 1); 
      if (qusup != null) 
      { 
       qusup.ID = id; 
      } 
     }   
    } 
    if (st == "down") 
    { 
     qus.ID = +1; 
     var qusup = db.Qusetions.SingleOrDefault(q => q.ID == q.ID + 1); 
     if (qusup != null) 
     { 
      qusup.ID = id; 
     } 
     db.SaveChanges(); 
    } 

    return RedirectToAction("Index", new RouteValueDictionary(new { controller = "Qustions", action = "Index", id = id })); 
} 
+1

不要修改Id列,如果它的主鍵。添加到您的實體新列SortIndex中,您將使用它對行進行排序。然後根據需要修改這個新屬性。 – Lesmian

+0

感謝您的幫助,但是如何按排序索引 – Sultan

+1

db.Qusetions.SingleOrDefault(q => q.SortIndex == q.SortIndex - 1)來枚舉列表。只需引入另一個將保存當前排序順序的字段。您不能修改您的主鍵的Id值。 – Lesmian

回答

0

你真的不應該爲此使用主鍵Id。向你的Question添加一個屬性會更好,這將用於排序問題的單一目的。

public class Qusetion 
{ 
    // ... 
    public int SortIndex {get; set;} 
    // ... 
} 

你的控制器動作會是這樣的:

public ActionResult ChangeSortIndex(int id , string st) 
{ 
    var qus = db.Qusetions.Find(id); 

    if(qus != null) 
    { 
     switch(st) 
     { 
      case "up": 
       qus.SortIndex++; 
       break; 

      case "down": 
       qus.SortIndex--; 
       break; 
     } 

     db.SaveChanges(); 
    } 

    return RedirectToAction("Index", new RouteValueDictionary(new { controller = "Qusetions", action = "Index", id = id })); 
} 

當你顯示你的問題,你必須對它們進行排序:

var questions = db.Qusetions.OrderBy(x => x.SortIndex) 

還要注意的是SortIndex在更新一個非常簡單的方法(++和 - ),你將不得不更新幾個索引來實現所需的排序。我想對於小列表這可以工作。

你可以使用一些更詳細說明,如:What's the best way to manage list item sort order

注意:在你的代碼,它是一個錯字或你真的拼了:Quse重刑?

+0

很酷的解釋面臨的困境,甚至爲我開啓了新的視野,實際上拼寫是錯誤的,前面有數百個函數,並且不允許我修改它,將在最終修訂中,上帝願意。哦,創造者,問候你 – Sultan