Blazor Razor页面ViewModel注入服务报错CS7036的解决方法
问题:Blazor MAUI中ViewModel注入验证器时出现CS7036错误
场景重现
Razor页面代码:
@page "/registration" @inherits RegistrationPageViewModel <h3> @Localizer["Registration"] </h3>
ViewModel代码:
public class RegistrationPageViewModel : ComponentBase { public IStringLocalizer<AppLocalizations> Localizer; public IValidator<RegistrationPageViewModel> _validator; public RegistrationPageViewModel(IValidator<RegistrationPageViewModel> validator) { _validator = validator; } // 其他代码... }
验证器代码:
public class RegistrationValidator : AbstractValidator<RegistrationPageViewModel> { public RegistrationValidator(IStringLocalizer<AppLocalizations> stringLocalizer) { // 验证规则... } }
DI配置代码:
public static class MauiProgram { public static MauiApp CreateMauiApp() { var builder = MauiApp.CreateBuilder(); builder .UseMauiApp<App>() .RegisterAppServices() .RegisterViewModels() .RegisterViews() }); // 此处存在语法错误 builder.Services.AddMauiBlazorWebView(); return builder.Build(); } public static MauiAppBuilder RegisterValidators(this MauiAppBuilder mauiAppBuilder) { mauiAppBuilder.Services.AddScoped<IValidator<RegistrationPageViewModel>, RegistrationValidator>(); return mauiAppBuilder; } public static MauiAppBuilder RegisterViewModels(this MauiAppBuilder mauiAppBuilder) { mauiAppBuilder.Services.AddScoped<MainPageViewModel>(); mauiAppBuilder.Services.AddScoped<LoginPageViewModel>(); mauiAppBuilder.Services.AddScoped<RegistrationPageViewModel>(); return mauiAppBuilder; } public static MauiAppBuilder RegisterViews(this MauiAppBuilder mauiAppBuilder) { mauiAppBuilder.Services.AddScoped<LoginPage>(); mauiAppBuilder.Services.AddScoped<RegistrationPage>(); return mauiAppBuilder; } // 其他代码... }
错误信息
CS7036 没有与“RegistrationPageViewModel.RegistrationPageViewModel(IValidator
)”的必需参数“validator”对应的实参
修复方案
1. 改用属性注入替代构造函数注入
Blazor组件(继承ComponentBase的类)由渲染引擎实例化,不支持构造函数注入,必须用[Inject]特性标记属性实现注入:
public class RegistrationPageViewModel : ComponentBase { [Inject] public IStringLocalizer<AppLocalizations> Localizer { get; set; } [Inject] public IValidator<RegistrationPageViewModel> Validator { get; set; } // 移除原有的构造函数 // 其他代码... }
2. 修正DI配置中的遗漏
- 在
CreateMauiApp中调用RegisterValidators扩展方法,确保验证器服务被注册 - 添加本地化服务注册,满足
RegistrationValidator的依赖 - 修复语法错误(多余的
});):
public static MauiApp CreateMauiApp() { var builder = MauiApp.CreateBuilder(); builder .UseMauiApp<App>() .RegisterAppServices() .RegisterValidators() // 新增:注册验证器 .RegisterViewModels() .RegisterViews(); // 修正语法错误 builder.Services.AddMauiBlazorWebView(); builder.Services.AddLocalization(); // 新增:注册本地化服务 return builder.Build(); }
3. 清理Razor页面冗余代码
移除@page行末尾多余的分号:
@page "/registration" @inherits RegistrationPageViewModel <h3> @Localizer["Registration"] </h3>
核心原因
Blazor组件的实例生命周期由框架管理,不是直接从DI容器获取实例,因此构造函数注入无法生效。必须使用Blazor提供的属性注入机制([Inject]特性)来获取DI容器中的服务。同时要确保所有依赖的服务都已正确注册到DI容器中。
内容的提问来源于stack exchange,提问作者Movsar Bekaev
相关产品推荐
相关产品推荐

