You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何初始化带有required修饰符必填属性的ViewModel?

解决新版C#中ViewModel required属性的实例化问题

你遇到的核心问题是混淆了C#编译时的required修饰符和ASP.NET Core运行时的[Required]验证注解:前者强制对象创建时必须初始化属性,后者用于验证用户提交的表单数据是否为空。针对你的场景,有两种规范的解决方案:

方案1:回归使用[Required]验证注解(推荐)

如果你的核心需求是仅在用户提交表单时验证必填项,而非编译时强制对象初始化,那么应该用ASP.NET Core的[Required]注解配合可空引用类型,完全不需要C#的required修饰符:

public class MyViewModel
{
    [Required]
    public string? FirstName { get; set; }

    public string? MiddleName { get; set; }

    [Required]
    public string? LastName { get; set; }
}

这样做的好处:

  • 编译时允许你直接new MyViewModel()实例化,符合GET请求渲染空表单的场景
  • 运行时通过[Required]确保用户提交的表单中FirstName和LastName不为空
  • 可空引用类型string?明确表达了属性初始值可以为null的语义

方案2:用[SetsRequiredMembers]标记无参构造函数

如果你确实需要保留C#的required修饰符(比如业务逻辑要求对象必须始终拥有这些属性),可以给ViewModel添加无参构造函数,并标记[SetsRequiredMembers]属性,告诉编译器该构造函数已处理所有required成员的初始化:

using System.Diagnostics.CodeAnalysis;

public class MyViewModel
{
    [SetsRequiredMembers]
    public MyViewModel()
    {
        // 无需赋值,该属性仅用于满足编译要求
    }

    public required string FirstName { get; set; }

    public string? MiddleName { get; set; }

    public required string LastName { get; set; }
}

此时你可以正常使用new MyViewModel()实例化,同时保留required修饰符的编译时检查(在其他需要创建完整对象的场景下,编译器仍会强制初始化required属性)。

为什么不推荐空字符串初始化

用FirstName = string.Empty这种方式规避编译错误的问题在于:

  • 违背了“由用户填写初始值”的语义,属性初始值是你硬编码的空字符串,而非用户输入
  • 部分验证规则(如[MinLength(2)])会将空字符串视为无效输入,可能提前触发错误提示,影响用户体验

内容的提问来源于stack exchange,提问作者GendoIkari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 05:07:08