为什么将DateTime传递给新的控制器方法时,TimeOfDay属性会被截断?

时间:2019-06-11 13:25:22

标签: c# datetime asp.net-core

我在SQL表中有几个日期,代表何时从我们的应用程序上传文件。

SQL Dates

在我的代码中,我有逻辑来确定如果存在一个文件,多个文件等情况,应该发生的各种事情。其中之一是,如果存在多个文件,则用户可以选择任意数目的文件进行处理

下面是我的控制器中处理多个文件的代码。

    [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值列表包含一天中的时间,因此我可以将它们与数据库中的时间戳进行直接比较(稍后将其用于将数据迁移到不同的表中)。

Values are shown in debug

但是,一旦我选择了要处理并发布表格的日期,TimeOfDay属性似乎就自动清除了,并且我丢失了这些数据,这现在导致我的存储过程找不到直接匹配项在数据库中,并且不处理任何数据。

TimeOfDay is gone

查看调试时显示的代码和值:

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

enter image description here

为什么会发生这种情况,我该怎么做?

1 个答案:

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