含required成员的CardView类在Razor运行时编译报错,如何保留required解决?
我们有一个包含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

