检查 DateTime 类型的值是不是在视图中为空,如果为空则显示空白
Posted
技术标签:
【中文标题】检查 DateTime 类型的值是不是在视图中为空,如果为空则显示空白【英文标题】:Checking if the value of type DateTime is null in view and showing blank if null检查 DateTime 类型的值是否在视图中为空,如果为空则显示空白 【发布时间】:2013-07-29 07:59:43 【问题描述】:从我的控制器我已经将值模块传递给查看
public ActionResult Details(long id, string owner)
var module = _ownedModuleRepository.GetModuleDetails(id, owner);
return View(module);
我已经在视图中显示了它包含的值,如下所示
<dt>ID</dt>
<dd>@Model.Id</dd>
<dt>Module ID</dt>
<dd>@Model.ModuleId</dd>
<dt>Owner</dt>
<dd>@Model.Owner</dd>
<dt>Module Type</dt>
<dd>@Model.TypeName</dd>
<dt>Module Kind</dt>
<dd>@Model.KindName</dd>
<dt>Ownership Start Date</dt>
<dd>@Model.Start</dd>
<dt>Ownership End Date</dt>
<dd>@Model.End</dd>
@foreach (var properties in Model.Properties)
<dt>Property Name</dt>
<dd>@properties.Name</dd>
<dt>Property Value</dt>
<dd>@properties.Value</dd>
当前 @Model.End 为空,它是 DateTime 类型,我已将它设置为在 viewmodel 中可以为空。 因为它是空的,这就是我所看到的
如您所见,Ownership End Date 的值取自下方的 Property Name 的值。如果 @Model.End 为空,如何将其设置为空?
编辑 1:
我的模型
public class OwnedModuleDetails
public long Id get; set;
public string ModuleId get; set;
public string Owner get; set;
public string KindName get; set;
public string TypeName get; set;
public DateTime Start get; set;
public DateTime? End get; set;
public IEnumerable<Property> Properties get; set;
存储库中的方法
public OwnedModuleDetails GetModuleDetails(long id, string owner)
// ReSharper disable ImplicitlyCapturedClosure
var module = (_dbSis.OwnedModules.Where(t => t.Id == id).Select(m => new OwnedModuleDetails
// ReSharper restore ImplicitlyCapturedClosure
Id = id,
ModuleId = m.ModuleId,
TypeName = m.ModuleType.TypeName,
KindName = m.ModuleType.ModuleKind.KindName,
Owner = owner,
Start = m.Start,
End = m.End,
Properties = m.PropertyConfiguration.PropertyInstances.Select(
x => new Property Name = x.Property.Name, Value = x.Value )
));
return (module.FirstOrDefault());
【问题讨论】:
在DateTime?
类型中获取字符串值的方式很奇怪。您确定 End
属性是 DateTime?
吗?这是哪里来的MicrophoneArrayRackModuleId
?
它设置为日期和时间,我已将我的模型作为编辑,方法控制器也在存储库中调用
这个MicrophoneArrayRackModuleId
来自哪里?您不可能为 DateTime 属性获得这样的输出。
我的模型有IEnumerable<Property> Properties
属性类包含Name(字符串)和Value(字符串),MicrophoneRackModuleId
是@987654333之一@名称
【参考方案1】:
尝试添加空格:
<dt>Ownership End Date</dt>
<dd>
@if (Model.End != null)
@Model.End
else
@:
</dd>
【讨论】:
对于第一个选项,我在@:&nbsp;
的 : 中收到第二个选项的错误 There is no implicit conversion between 'string' and 'system.web.Ihtmlstring'
,它显示 @ must be followed by valid code block
。我尝试删除 @: 但在浏览器中它显示 Ownership End Date
为 if (Model.End != null) else
if
语句应以@
为前缀。
是的,我忘了。谢谢,它奏效了。因此,如果您有一个空值,那么下一项的值会出现在上一项?就像我的情况一样。
不,这是您的 <dt>
和 <dd>
标签的 CSS 问题。如果它显然是空的,浏览器会显示下一个。您应该尝试修复您的 CSS 文件。【参考方案2】:
当用户在日期列中插入空值时,我曾经遇到过这个问题。
导致此错误的原因:
System.InvalidOperationException: Nullable object must have a value
要解决这个问题,而不是 DisplayFor
,只需在您的视图中使用以下代码,因此如果列值为 null,它将显示 Date is Empty
<td>
@(item.Startdate.HasValue ? item.Startdate.Value.ToString("dd/MM/yyyy") : "Date is Empty")
</td>
进一步阅读 this 和 this 模型
希望能帮助别人。
【讨论】:
【参考方案3】:您可以使用 C# 空合并运算符:
@(Model.End?.ToString("dd/MM/yyyy") ?? "Date is Empty")
【讨论】:
【参考方案4】:这里不会进行三元运算:
@(Model.End != null ? Model.End.ToString() : "")
【讨论】:
以上是关于检查 DateTime 类型的值是不是在视图中为空,如果为空则显示空白的主要内容,如果未能解决你的问题,请参考以下文章
Ajax 请求复杂类型在 ApiController 参数中为空
如果链接字段的标题值在 drupal 7 视图中为空,如何隐藏标题?