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 中移出。
首先,这个问题的名字不太好,但我想不出更好的名字。 我正在做一个项目,我每天报告几个小时,并且在不同的项目上。
这是它的样子。
但是现在的问题是,如果我提交它会变成这样。
就像我们在本月摘要中看到的那样,在第二个日期它复制了项目并显示了两次,如果我也添加更多日期,就会发生这种情况。 但它从来没有在第一次约会时发生。
我一直在调试它,但我没有看到它与第一次 运行 时有任何不同的行为,所有值都相同等等。
这是控制器
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 中移出。