如果你想重新安排问题列表,例如,并且让最后一个问题移动,那么我所做的一切之前的问题就是关键的价值,但在我看来,我错了,证明你收到这条消息了:
EntityFramework.dll中出现'System.InvalidOperationException'类型的异常,但未在用户代码中处理
附加信息:属性“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 }));
}
答案 0 :(得分: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 ?