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

含required成员的CardView类在Razor运行时编译报错,如何保留required解决?

保留required关键字解决Razor运行时编译错误

我们有一个包含required成员的类:

public class CardView
{
    public required string Description { get; set; }
    public required string ButtonText { get; set; }
}

在Razor视图中,我们编写了如下代码:

async Task RenderList(IEnumerable<Item> items)
{
    <div class="gap-4 grid sm:grid-cols-1 lg:grid-cols-2 xl:grid-cols-4">
        @foreach (var item in items)
        {
            var card = new CardView
            {
                ButtonText = "View",
                Description = item.Description,
            };

            @await Html.Partial("_card", card);
        }
    </div>
}

但这段代码抛出了如下错误:

Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.CompilationFailedException
Error CS0619: 'CardView.CardView()' is obsolete: 'Constructors of types with required members are not supported in this version of your compiler.'

请问是否有办法在不删除required关键字的情况下解决该错误?

更新
此问题与我们本地使用的RazorRuntimeCompilation包(Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation)相关,当前版本为8.0.12。我推测可能需要升级到.NET 9才能解决该问题。


解决方案

不需要直接升级到.NET 9,以下几种方案可解决问题:

  • 显式添加带参数的构造函数
    为CardView类添加包含所有required成员的构造函数,在Razor视图中通过构造函数初始化实例,避开默认构造函数的调用:

    public class CardView
    {
        public required string Description { get; set; }
        public required string ButtonText { get; set; }
    
        public CardView(string description, string buttonText)
        {
            Description = description;
            ButtonText = buttonText;
        }
    }
    

    对应Razor视图中的初始化代码修改为:

    var card = new CardView(item.Description, "View");
    
  • 升级Razor运行时编译包到兼容补丁版本
    尝试将Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation包升级到.NET 8的最新补丁版本(如8.0.16及以上),部分后期补丁修复了required成员在Razor运行时编译中的兼容性问题。

  • 使用C# 12+主构造语法简化类定义
    若项目已启用C# 12,可通过主构造函数优化CardView类,让编译器正确处理Razor中的对象初始化逻辑:

    public class CardView(string description, string buttonText)
    {
        public required string Description { get; set; } = description;
        public required string ButtonText { get; set; } = buttonText;
    }
    
  • 禁用Razor运行时编译(生产环境可选)
    若项目在生产环境不需要运行时编译能力,可在Program.cs中移除Razor运行时编译的配置,改用预编译视图,此时会使用项目主编译器版本进行编译,避免版本不兼容问题:

    // 移除如下类似配置代码
    builder.Services.AddRazorPages().AddRazorRuntimeCompilation();
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 13:44:55