如果值为 null,则在我的视图中显示值会引发 ToString 错误

Displaying a value in my View throws an error with ToString if value is null

在我看来 asp.net 核心,我试图在 @foreach 中显示我的价值观。在这里

@foreach (var item in Model)
{
    <tr>
        <td>@item.FirstName</td>
        <td>@item.LastName</td>
        <td>@item.Birthdate.Value.ToString("d")</td>
        <td>@item.Startdate.Value.ToString("d")</td>
    </tr>
}

Startdate 中存在空值时,这将引发数据库错误。

如果我把@item.Startdate.Value.ToString("d")改成

@item.Startdate, 我不再收到错误消息。我的所有属性都可以为空。

我的困惑是因为我认为如果我使用 .Value.ToString("whatever") 这将确保有一个值,如果有那么它会 ToString() 它,如果没有值那么它会离开它null,什么都不会发生。

我的问题是如何 ToString 在我的视图中的一个值,如果它不为空,否则忽略?

试试下面的代码。您也可以按照相同的出生日期。

@foreach (var item in Model)
{
    var sDate = item.Startdate.HasValue ? item.Startdate.Value.ToString("d") : "";
    <tr>
        <td>@item.FirstName</td>
        <td>@item.LastName</td>
        <td>@item.Birthdate.Value.ToString("d")</td>
        <td>@sDate </td>
    </tr>
}

如果您的 Nullable 没有值(HasValue 为假)请求它的 Value 是无效操作,并且如果您的代码直接使用您的 nullable 的 .Value 而不检查它首先你可以跳过使用 nullables! :)

Nullable 背后的想法是帮助处理不能为 null 的情况,然后需要一种方法使它可以为 null,因为它是“不可避免的”,但是您需要针对您使用的每种情况进行检查它,无论它是否具有价值并采取适当的行动

如果你想要一个可能有值也可能没有值的可空对象,并且你想在它上面盲目调用一些东西并知道你有一个值,那么你需要这样的东西:

item.Startdate.GetValueOrDefault(DateTime.MinValue).ToString("d")

如果没有当前值,您必须决定使用什么值。您可以通过对可为空的对象使用空传播器来简化事情:

item.Startdate?.ToString("d")

如果可为 nullable 没有值,则整个事物的计算结果为 null。如果它有一个值,它的计算结果为 DateTime(或可为 nullable 中的任何类型),然后 ToString'd。您只能在容忍 null 的上下文中真正使用它,例如设置文本框的 text

当它求值为 null 时,它也可以被 null 合并:

item.Startdate?.ToString("d") ?? DateTime.MinValue.ToString("d")

此方法的较短变体是将可空日期时间与实际日期时间合并,然后将结果串起来:

(item.Startdate ?? DateTime.MinValue).ToString("d")

最后一种形式与之前的 GetValueOfDefault 变体类似,只是 ?? 直到最近才出现; GVOD() 老了很多