如何处理空日期时间出现在MVC模型

本文关键字:时间 模型 MVC 日期 何处理 处理 | 更新日期: 2023-09-27 18:17:23

我有一个控制器动作,它执行SQL查询并将模型类型的列表传递回视图。然后视图输出一个简单的表,其中包含每个模型中包含的数据。

我的模型:

public class UserModel
{
    [Key]
    public string UserID { get; set; }
    public string EmailAddress { get; set; }
    public string Password { get; set; }
    public string SecurityToken { get; set; }
    [DisplayFormat(DataFormatString = "{0:yyyy/MM/dd}", ApplyFormatInEditMode = true)]
    public DateTime CreatedDate { get; set; }
    [DisplayFormat(DataFormatString = "{0:yyyy/MM/dd}", ApplyFormatInEditMode = true)]
    public DateTime LastUsedDate { get; set; }
    [DisplayFormat(DataFormatString = "{0:yyyy/MM/dd}", ApplyFormatInEditMode = true)]
    public DateTime LastUpdatedDate { get; set; }
}

我的观点:

@foreach (var item in Model)
{
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.EmailAddress)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.SecurityToken)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.CreatedDate)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.LastUsedDate)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.LastUpdatedDate)
        </td>
    </tr>
}

对于数据中的某些行,LastUsedDate和LastUpdated date为空,因此它们诉诸于1900-01-01,并且它们在视图中显示为空。

是否有办法不显示这个值,如果它是1900-01-01?

我在控制器中的查询是

SELECT UserID, EmailAddress, SecurityToken, CreatedDate, 
ISNULL(LastUsedDate, '1900-01-01') AS LastUsedDate, 
ISNULL(LastUpdatedDate, '1900-01-01') AS LastUpdatedDate 
FROM table1 ORDER BY CreatedDate DESC

我将它们分配给模型,像这样:

var user = new UserModel
{
    CreatedDate = (DateTime)reader["CreatedDate"],
    LastUsedDate = (DateTime)reader["LastUsedDate"],
    LastUpdatedDate = (DateTime)reader["LastUpdatedDate"]
}

如何处理空日期时间出现在MVC模型

将属性类型从DateTime更改为可空的DateTime(DateTime?)

public class UserModel
{
    // Your existing properties goes here
    public DateTime? LastUpdatedDate { get; set; }
}

现在在您的SQL中,不要将NULL替换为任何日期时间值(例如:1900-01-01)。只返回NULL

SELECT UserID, EmailAddress, SecurityToken, CreatedDate,LastUpdatedDate
FROM table1 
ORDER BY CreatedDate DESC

从数据读取器读取数据时,执行空检查。如果该值不为空,则将其赋值给LastUpdatedDate属性。

var user = new UserModel
{
    EmailAddress = reader.GetString(reader.GetOrdinal("EmailAddress")),
    CreatedDate = reader.GetDateTime(reader.GetOrdinal("CreatedDate"))   
}
if(!reader.IsDBNull(reader.GetOrdinal("LastUpdatedDate")))
{
  user.LastUpdatedDate = reader.GetDateTime(reader.GetOrdinal("LastUpdatedDate"));
}

将您的模型改为使用Nullable<DateTime>:

[DisplayFormat(DataFormatString = "{0:yyyy/MM/dd}", ApplyFormatInEditMode = true)]
public DateTime? CreatedDate { get; set; }
[DisplayFormat(DataFormatString = "{0:yyyy/MM/dd}", ApplyFormatInEditMode = true)]
public DateTime? LastUsedDate { get; set; }
[DisplayFormat(DataFormatString = "{0:yyyy/MM/dd}", ApplyFormatInEditMode = true)]
public DateTime? LastUpdatedDate { get; set; }