我在SQL表中有几个日期,代表何时从我们的应用程序上传文件。
在我的代码中,我有逻辑来确定如果存在一个文件,多个文件等情况,应该发生的各种事情。其中之一是,如果存在多个文件,则用户可以选择任意数目的文件进行处理
下面是我的控制器中处理多个文件的代码。
[HttpGet]
public IActionResult SelectFilesToProcess(int Id, string ClientConnectionString)
{
FileSelectionToProcess files = new FileSelectionToProcess();
files.ClientID = Id;
files.ConnectionString = ClientConnectionString;
List<DateTime> uploadDates = _clientProcessingService.GetFileUploadDates(ClientConnectionString);
foreach (DateTime date in uploadDates)
{
files.FileDatesToProcess.Add(new FileDateToProcess { FileDate = date });
}
return View(files);
}
[HttpPost]
public IActionResult SelectFilesToProcess(int Id, FileSelectionToProcess Model)
{
DateTime dateAdded = DateTime.Now;
//Foreach date, import to CurrMo
foreach(var fileDate in Model.FileDatesToProcess)
{
if(fileDate.IsChecked)
{
_importProcessing.InsertPOSImportedToCurrMo(Model.ConnectionString, dateAdded, fileDate.FileDate);
}
}
return RedirectToAction("Processing", new { Id, IsProcessing = false });
}
如果有多个文件,则调用此操作。我查询数据库以获取所有日期,并将它们添加到我创建的存储DateTime和bool以确定要检查哪些文件的复杂类型的列表中。这种FileSelectionToProcess
类型是我在视图中的模型。
在调试过程中,我能够看到我的DateTime值列表包含一天中的时间,因此我可以将它们与数据库中的时间戳进行直接比较(稍后将其用于将数据迁移到不同的表中)。
但是,一旦我选择了要处理并发布表格的日期,TimeOfDay
属性似乎就自动清除了,并且我丢失了这些数据,这现在导致我的存储过程找不到直接匹配项在数据库中,并且不处理任何数据。
查看调试时显示的代码和值:
<body>
<h3>Select the imports you would like to process.</h3>
<form method="post">
<div class="container-fluid col-lg-12 pt-3">
<input type="hidden" asp-for="@Model.ClientID" />
<input type="hidden" asp-for="@Model.ConnectionString" />
<table class="col-lg-12 table">
<thead>
<tr>
<th>File</th>
<th>Details</th>
</tr>
</thead>
<tbody>
@for (int i = 0; i < Model.FileDatesToProcess.Count(); i++)
{
<tr>
<td>
<input asp-for="@Model.FileDatesToProcess[i].IsChecked" type="checkbox" /> @Model.FileDatesToProcess[i].FileDate.ToString("MM/dd/yyyy HH:mm:ss")
<input type="hidden" asp-for="@Model.FileDatesToProcess[i].FileDate">
</td>
<td>
<input type="button" value="View Details" />
</td>
</tr>
}
</tbody>
</table>
</div>
<input type="submit" value="Continue Processing" title="Click to continue to next step of processing" class="btn btn-light col-lg-3" />
</form>
为什么会发生这种情况,我该怎么做?
答案 0 :(得分:0)
好吧,经过更多搜索之后,我进行了以下更改。如果您对我之前如何解决此问题感到好奇,请检查问题和答案的编辑内容。
我正在使用的模型类有一个List<DateToProcess>
,该类以前是单个布尔值,用于确定是否检查了该值以及一个DateTime。我现在添加了一个long FileDateTick
属性。
我的视图现在具有以下内容:
<input type="hidden" asp-for="@Model.FileDatesToProcess[i].FileDateTick" value="@Model.FileDatesToProcess[i].FileDate.Ticks" />
现在,控制器操作将解析每个发送的DateTime(以滴答为单位),并创建一个新的DateTime,并将其发送到存储过程。
[HttpPost]
public IActionResult SelectFilesToProcess(int Id, FileSelectionToProcess Model)
{
DateTime dateAdded = DateTime.Now;
DateTime fileDateFromTicks;
string timeSpan;
//Foreach date, import to CurrMo
foreach (var fileDate in Model.FileDatesToProcess)
{
if(fileDate.IsChecked)
{
timeSpan = fileDate.FileDateTick.ToString();
fileDateFromTicks = new DateTime(long.Parse(timeSpan));
_importProcessing.InsertPOSImportedToCurrMo(Model.ConnectionString, dateAdded, fileDateFromTicks);
}
}
return RedirectToAction("Processing", new { Id, IsProcessing = false });
}