跳进一年级列表

时间:2016-03-22 11:37:43

标签: asp.net-mvc entity-framework

如果你想重新安排问题列表,例如,并且让最后一个问题移动,那么我所做的一切之前的问题就是关键的价值,但在我看来,我错了,证明你收到这条消息了:

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 }));
}

1 个答案:

答案 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