如果值为 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()
老了很多
在我看来 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()
老了很多