Joe*_*ues 6 c#-8.0 .net-6.0 c#-10.0
我刚刚使用 .NET 6.0 和 C# 10 创建了一个新的 ASP.NET MVC 应用程序,并且在此项目模板中默认启用可空引用类型功能。不过好吧,我正在学习如何处理这个功能。
我有以下 ViewModel 类:
public class CustomerViewModel
{
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
为了避免 Name 字段出现 Nullable Reference Type 警告,我创建了一个构造函数来初始化该字段:
public class CustomerViewModel
{
public CustomerViewModel(string name) => Name = name;
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
但是现在,当我尝试在控制器操作中接收此 ViewModel 时,绑定机制需要一个无参数构造函数:
public IActionResult CreateCustomer(CustomerViewModel customer)
{
}
Run Code Online (Sandbox Code Playgroud)
如果我向 ViewModel 添加无参数构造函数,我会再次收到 Nullable Reference Type 警告,因为 Name 字段在构造函数之外不会有初始值。
该字段不可为空,因此我无法通过添加问号运算符使其可为空。对我来说,用“随机”值(例如 String.Empty)初始化该字段是没有意义的。
您如何处理这个功能?您是否遇到过这样的场景?你是怎么解决的?
谢谢。
由于模型绑定的性质(首先实例化对象,然后填充其属性),与可为空引用类型功能存在冲突。不过,有一篇很好的博客文章提供了 3 种处理此问题的方法:
将所有字段声明为可为空并添加[Required]属性
[Required]
public string? Name { get; set; }
Run Code Online (Sandbox Code Playgroud)
将 Null-forgiving 运算符添加到所有不可为 null 的属性
public string Name { get; set; } = null!;
Run Code Online (Sandbox Code Playgroud)
禁用 ViewModel 的可为空警告
#nullable disable warnings
public class CustomerViewModel
{
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
就像博客作者一样,我更喜欢第三种方法。由于该问题仅发生在需要无参数构造函数的类上,因此只能对这些类禁用可空检查。所有财产都保持整洁。
| 归档时间: |
|
| 查看次数: |
1869 次 |
| 最近记录: |