如何使DateTime绑定到RazorPages ViewModel?

时间:2018-12-21 10:21:10

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

我有一个使用RazorPages的ASP Core 2.2项目,我正在绑定一些数据,其中一些数据发送给客户端,客户端需要在发送之前将数据编辑到需要的位置。

这适用于所有情况,直到我想绑定DateTime对象为止。数据已按预期绑定到HTML datetime-local控件,并且根据网络流量,它以POST请求形式发送回数据,但是OnPost中的DateTime对象始终读取为01/01/0001

如果这是问题,我已经在其他浏览器中进行了检查。 FireFox甚至不能正确呈现本地日期时间(它只是一个文本框,而不是日期选择器)。

我还尝试将DateTime对象作为本地时间和UTC时间发送,并且将我的区域性设置为en-GB,因为这就是我所在的位置。

我的代码如下:

RequestLocalizationOptions localizationOptions = new RequestLocalizationOptions
{
    SupportedCultures = new List<CultureInfo> { new CultureInfo("en-GB") },
    SupportedUICultures = new List<CultureInfo> { new CultureInfo("en-GB") },
    DefaultRequestCulture = new RequestCulture("en-GB")
};

app.UseRequestLocalization(localizationOptions);

每行的StartAt设置为:

StartAt = DateTime.Now.ToUniversalTime(),

并被这样绑定在视图上:

<input asp-for="@Model.CreationData.DataLines[lnNo].StartAt" class="form-control"/>

整个绑定对象是:

public class JobCreationData
{
    [Required]
    public string Name { get; set; }

    [Required]
    public string Description { get; set; }

    public int SelectedJobWorkflow { get; set; }

    public List<JobCreationDataLine> DataLines { get; set; } = new List<JobCreationDataLine>();

    public class JobCreationDataLine
    {
        public int WorkflowVersionId { get; set; }
        public string WorkflowVersionCode { get; set; }
        public string WorkflowVersionDescription { get; set; }

        public int SelectedWorkCenterId { get; set; }

        public DateTime StartAt;

        public List<JobCreationBusinessUnit> BusinessUnits { get; set; }
    }

    public class JobCreationBusinessUnit
    {
        public int WantedBusinessUnitId { get; set; }
        public int BusinessUnitId { get; set; }
        public string Alias { get; set; }
        public bool IsRequired { get; set; }

        public int SelectedBusinessUnitLineId { get; set; }
    }
}

下面是显示HTML5控件,绑定对象结果无效以及在OnPost中发送的表单数据的屏幕截图。

BindingIssue FormData

如您所见,我显然希望DateTime正确绑定。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

根据您的要求,我会将其写为答案。

StartAt字段应使用setter和getter转换为属性:

public DateTime StartAt { get; set; }

您可以通过制作custom model binder使代码更进一步。

想象一下,您正在使用不同的DateTime格式和区域性,并且您希望所有值在提交到后端时都采用特定格式。您可以将它作为活页夹编写一次,而不必在任何地方手动完成,