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