asp.net c# 控制器行为怪异

asp.net c# Controller acting weird

首先,这个问题的名字不太好,但我想不出更好的名字。 我正在做一个项目,我每天报告几个小时,并且在不同的项目上。

这是它的样子。

但是现在的问题是,如果我提交它会变成这样。

就像我们在本月摘要中看到的那样,在第二个日期它复制了项目并显示了两次,如果我也添加更多日期,就会发生这种情况。 但它从来没有在第一次约会时发生。

我一直在调试它,但我没有看到它与第一次 运行 时有任何不同的行为,所有值都相同等等。

这是控制器

public ActionResult TimeReport(FormCollection form, Guid? id)
    {
        ViewDataDictionary vd = new ViewDataDictionary
        {
            ["projects"] = new DatabaseLayer().GetConsultantProjects(Constants.CurrentUser(User.Identity.Name)),
            ["id"] = 1,
            ["showDescription"] = true
        };
        ViewData["vd"] = vd;

        NewTimeReportModel projectData = new NewTimeReportModel();

        if (form != null && form.AllKeys.Contains("delete"))
        {
            new DatabaseLayer().DeleteTimeReport(Guid.Parse(form["ReportId"]));
            LoadDefaultSettings(projectData);
            ViewData.Model = projectData;
            return View();
        }

        if (id.HasValue && (form == null || form.AllKeys.Length == 0))
        {
            using (DatabaseLayer db = new DatabaseLayer())
            {
                var timeReport = db.GetTimeReport(id.Value);
                projectData = new NewTimeReportModel(timeReport);
                if (projectData.Projects.Count == 1)
                    projectData.Projects[0].Hours = null;
            }
        }
        else if (form == null || form.AllKeys.Length == 0)
        {
            LoadDefaultSettings(projectData);
        }
        else
        {
            //Takes all the dates that is being sent from the view and put into a string.
            string input = (form["date"]);
            input = input.Trim();
            string[] dates = input.Split(' ');

            //Foreach to loop over all the dates, also rebuilds the string to look like yy-mm-dd so we can parse it to a datetime
            foreach (string result in dates.Select(date => date.Substring(0, 2) + '-' + date.Substring(2, 2) + "-" + date.Substring(4, 2)))
            {
                DateTime reportDate;
                if (!DateTime.TryParse(result, out reportDate))
                {
                    ModelState.AddModelError("Date", "Felaktikt datum");
                }

                var projectNumbers = (from x in form.AllKeys
                    where x.Contains("_")
                    select x.Substring(x.IndexOf('_'))).Distinct();

                projectData.Times = new TimeReportTimes(form["startTime"], form["endTime"], form["breakTime"], ModelState);
                projectData.Date = reportDate;

                //Checks to see if we did choose a project.
                var enumerable = projectNumbers as string[] ?? projectNumbers.ToArray();
                if (!enumerable.Any())
                {
                    ModelState.AddModelError("Projekt", "Inga projekt valda...");
                }
                else
                {
                    int emptyHours = 0;

                    foreach (string projectNumber in enumerable)
                    {

                        projectData.Projects.Add(new NewTimeReportModel.Project
                        {
                            Description = form["description" + projectNumber],
                            Hours = null,
                            ProjectId = Guid.Parse(form["project" + projectNumber])
                        });

                        string hourString = form["hours" + projectNumber];
                        if (string.IsNullOrEmpty(hourString))
                        {
                            emptyHours++;
                            projectData.Projects[projectData.Projects.Count - 1].Hours =
                                projectData.Times.WorkedHours;
                        }
                        else
                        {
                            if (!projectData.Projects[projectData.Projects.Count - 1].SetHours(hourString))
                            {
                                ModelState.AddModelError("hours_" + projectNumber, "Felaktig antal timmar");
                            }
                        }
                    }
                    //Checks so the hours are right.
                    if (emptyHours > 1 || (emptyHours == 0 && projectData.Projects.Sum(x => x.Hours) != projectData.Times.WorkedHours))
                    {
                        ModelState.AddModelError("hours_" + enumerable.First(),
                            "Antalet timmar stämmer ej överrens");
                    }

                    //Checks so the worked hours is bigger than 0
                    if (projectData.Projects.Any(x => x.Hours <= 0))
                    {
                        ModelState.AddModelError("hours_" + enumerable.First(),
                            "Antalet timmar måste vara större än noll");
                    }

                    if (!string.IsNullOrEmpty(form["ReportId"]))
                    { 
                        projectData.ReportId = Guid.Parse(form["ReportId"]);
                    }

                    if (ModelState.IsValid)
                    {
                        //saves the report to the database
                        projectData.SaveToDatabase(Constants.CurrentUser(User.Identity.Name));
                        //Saves ViewData To true so we know in the view it's been posted.
                        ViewData["posted"] = true;

                        projectData = new NewTimeReportModel();
                        LoadDefaultSettings(projectData);
                    }
                    else if (projectData.Projects.Count == 1)
                    { 
                        projectData.Projects[0].Hours = null;
                    }
                }
            }
        }

        var missingdays = new DatabaseLayer().GetConsultantMissingDays(Constants.CurrentUser(User.Identity.Name));
        if (missingdays.Count == 0)
        {
        }
        else
        {
            ViewBag.MissingDays = missingdays;
        }

        ViewData.Model = projectData;

        return View();
    }

这并不奇怪,在 foreach 循环的最后我有这个 if 语句

                        if (ModelState.IsValid)
                    {
                        projectData.SaveToDatabase(Constants.CurrentUser(User.Identity.Name));
                        ViewData["posted"] = true;

                        //Loads default settings and projects.
                        projectData = new NewTimeReportModel();
                        LoadDefaultSettings(projectData);

                    }

最后像 LoadDefaultSettings(projectData); 一样再次加载所有设置,因此在保存第一个日期后,它确实为下一个日期再次加载所有设置。因为他们被复制了。所以我只是将它从 foreach 中移出。