c# - Razor 模板中的 Nullable DateTime 错误
问题描述
更新
所以看起来这在 .NET 4.7.2 中也是可以复制的:https://dotnetfiddle.net/NI8H1n
原来的
我DateTime?
在 netcoreapp3.1 中的剃刀模板中遇到了问题。模板正在运行:
Engine.Razor.RunCompile("templateName", "templateKey" model: model);
被传递的模型包含以下属性:
public DateTime? IssueDate { get; set; }
在模板内引发 null ref 错误的剃刀线是:
<td>Issue date: @(result.IssueDate.HasValue ? result.IssueDate.Value.ToString("dd/MM/yyyy") : "")</td>
错误:
Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: Cannot perform runtime binding on a null reference
所以经过一番调试,我发现如果我把模板里有问题的那行改成:
<td>Issue date: @(result.IssueDate != null? result.IssueDate.ToString("dd/MM/yyyy") : "")</td>
然后我们就可以走了。
所以我的问题是为什么初始线不起作用?
解决方案
由于您的视图 - 从您的 Fiddle 在下面复制 - 不包含@model
声明,因此该类型dynamic
正在用于视图模型。
@(Model.SomeDate.HasValue ? Model.SomeDate.Value.ToString("dd/MM/yyyy") : "No Value")
编译后,上面的语句如下所示 - 注意使用dynamic
.
public override async Task ExecuteAsync()
{
this.Write((((dynamic)base.Model).SomeDate.HasValue)
? ((dynamic)base.Model).SomeDate.Value.ToString("dd/MM/yyyy")
: "No Value"
);
}
考虑文档中的信息dynamic
- dynamic 类型的变量被编译成 object 类型的变量。因此,动态类型只存在于编译时,而不是运行时。
- 任何非空表达式都可以转换为动态类型
这使得该类型dynamic
必须在运行时评估其操作和数据类型。
public class SampleViewModel
{
public DateTime? SomeDate {get;set;}
}
鉴于您在上面的模型, whereSomeDate
的类型为Nullable<DateTime>
.
当该SomeDate
属性具有 valuenull
时,您会得到Cannot perform runtime binding on a null reference
异常,因为代码尝试访问.HasValue
a null
,而不是访问可能已转换为 a 的东西dynamic
(要点 2)。
当它SomeDate
具有DateTime.Now
Fiddle 中所示的值时,动态运行时绑定得出结论,它SomeDate
必须是类型System.DateTime
,因为DateTime.Now
它不可为空,并且只有非空表达式可以转换为dynamic
类型(要点 2)。
因此,您会得到'System.DateTime' does not contain a definition for 'HasValue'
异常,因为 aDateTime
不包含HasValue
属性。
使HasValue
检查工作的一种方法是在视图中包含模型声明,因为它避免了必须使用类型dynamic
- 请参阅更新的 Fiddle。
@model HelloWorldMvcApp.SampleViewModel
@(Model.SomeDate.HasValue ? Model.SomeDate.Value.ToString("dd/MM/yyyy") : "No Value")
推荐阅读
- swift - 如何在 UITableCell 中隐藏/调整视图大小?
- android - 房间 - 无法显示数据库的完整列表
- angular - CakePHP 3 到渐进式 Web 应用程序后端
- python - Cython 问题,不能在类变量上使用 cdef
- mingw - MingW64 不会为 lambda 生成完整的调试信息
- r - 基于R中的文本值重复行
- spring-mvc - 使用spring mvc将文件上传到服务器
- node.js - 如何使用nodejs编写的API在https上运行
- bash - 如何从 bash 中的循环创建字符串列表?
- c++ - 如何处理来自核心指南检查器关于 gsl::at 的静态分析警告?