【问题标题】:asp.net mvc controller calculating incorrect valuesasp.net mvc 控制器计算不正确的值
【发布时间】:2014-11-13 12:19:39
【问题描述】:

现在这让我很困扰。我有以下控制器操作方法:

public PartialViewResult ScrollEmployeeCompYear(int employeeid, string direction, int latestYearCurrentlyDisplayed)
{
    List<EmployeeCompensationYear> fourYearsList = new List<EmployeeCompensationYear>();
    Employee Employee = _db.Employees.Find(employeeid);
    EmployeeCompensationYear compyear;
    if (direction == "right")
    {
        int latestYearDisplayedMinusThree = latestYearCurrentlyDisplayed - 3;
        for (int i = 0; i < 4; i++)
        {
            if ((compyear = Employee.CompensationYear.Find(m => m.Year == --latestYearDisplayedMinusThree)) != null)
            {
                fourYearsList.Add(compyear);
            }
            else
            {
                break;
            }
        }
        fourYearsList.Reverse();
    }
    else if (direction == "left")
    {

        for (int i = 0; i < 4; i++)
        {
            if ((compyear = Employee.CompensationYear.Find(m => m.Year == ++latestYearCurrentlyDisplayed)) != null)
            {
                fourYearsList.Add(compyear);
            }
            else
            {
                break;
            }
        }
    }

    return PartialView(fourYearsList);
}

有两个问题,我从 Html.Ajax 帮助程序调用此方法,并且“latestYearCurrentlyDisplayed”返回 2020(我在数据库中的 employee.compensationYear)。顺便说一句,我在数据库中有这个模型从 2014 年到 2020 年的数据。

所以无论如何,第一个问题,当返回 2020 并且我得到“正确”的方向时,我正在创建一个新的 int 变量,它得到 2020-3,它应该等于 2017。然后在循环中,在 if 中,我将竞争者分配给员工的薪酬年份,其中年份等于“--latestYearDisplayedMinusThree”。这应该首先从 2017 中减去 1,然后分配它,但由于某种原因,在我的列表中的第一项中,我得到的是 2015 而不是 2016。

另一个问题是,当我“离开”并且 2015 年是我最近显示的年份时,它会进入 else if (direction == "left"),这很好,但随后它在我分配 compyear 的位置返回 null,即使我有++2015(再说一遍,我有 2014 到 2020)。

我在这里的代码中做错了吗??

【问题讨论】:

  • 您的fourYearsList 中有多少项?由于您反转了fourYearsList,因此该列表中的第一项可能是循环第二次迭代的结果,即2015
  • @DavidTansey 但我是在分配,而不是比较
  • @PhuongNguyen 我认为每次我从视图“提交”到控制器时都会创建一个新的控制器实例,所以如果我反转一次​​提交,我认为第二次提交是独立的,因此是一个新列表为添加而创建
  • @AbdulAhmad,您的假设是正确的(创建了一个新实例)
  • @StephenMuecke 感谢您的确认

标签: c# asp.net asp.net-mvc


【解决方案1】:

我认为问题在于一元(++x--x)运算符如何在循环内工作,并且可能没有按照您的预期执行。

但是,如果我正确理解您想要什么,那么这应该会简化一些事情:

if (direction == "right")
{
    fourYearsList = Employee.CompensationYear.Where(m => m.Year <= (latestYearCurrentlyDisplayed - 4)).Take(4).ToList();
}
else if (direction == "left")
{
    fourYearsList = Employee.CompensationYear.Where(m => m.Year >= (latestYearCurrentlyDisplayed + 1)).Take(4).ToList();   
}

latestYearCurrentlyDisplayed - 4latestYearCurrentlyDisplayed + 1 的起始值可能需要根据您要显示的内容进行调整,还需要根据您希望列表显示方式的顺序进行调整。

【讨论】:

  • 查看 take 的作用,这是否适应可能的空值?
  • 谢谢,我把 ++ 和 -- 改成了 += 和 -= 并且成功了!
  • @AbdulAhmad take 方法只会在执行Where 之后提取IQueryable 列表中可用的内容。因此Where 将首先执行查询,并从中创建一个子列表,然后Take 将拉取列表中的前 4 个元素。因此列表中不可能有null 元素。
猜你喜欢
  • 2023-03-14
  • 1970-01-01
  • 2015-01-04
  • 1970-01-01
  • 1970-01-01
  • 2010-10-10
  • 1970-01-01
  • 2021-09-18
  • 2010-10-31
相关资源
最近更新 更多