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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 08:50:37