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

ASP.NET Blazor中如何定义全局C#类供各Razor页面分部类调用

Blazor 全局公共类实现方法

你手动new实例不生效,核心原因是Blazor采用内置依赖注入(DI)容器管理服务与组件依赖,手动创建的实例无法自动获取Blazor上下文相关的服务(如NavigationManager、IJSRuntime、身份认证服务等),根据你的公共方法是否依赖外部服务,选对应实现方式即可:


方案1:无依赖静态工具类(最简单)

如果你的通用方法不依赖任何Blazor服务、第三方服务,只是纯逻辑处理(比如格式转换、字符串校验、数值计算),直接定义静态类即可,无需注册也无需实例化,全局可直接调用。

// 可以放在项目根目录的Utils文件夹下
public static class CommonStaticUtils
{
    // 示例:通用手机号脱敏方法
    public static string MaskPhone(string phone)
    {
        if (string.IsNullOrWhiteSpace(phone) || phone.Length < 11) return phone;
        return phone.Substring(0,3) + "****" + phone.Substring(7);
    }
}

在任意razor.cs中直接调用:

var masked = CommonStaticUtils.MaskPhone("13800138000");

方案2:带服务依赖的公共类(DI注入方式,推荐)

如果你的通用方法需要用到Blazor内置服务、其他已注册的业务服务,必须走DI注册流程,不要手动new实例,步骤如下:

  1. 定义公共类,所有依赖通过构造函数声明
public class CommonService
{
    // 声明你需要用到的依赖
    private readonly IJSRuntime _jsRuntime;
    private readonly NavigationManager _navigationManager;

    // DI容器会自动注入构造函数中要求的服务
    public CommonService(IJSRuntime jsRuntime, NavigationManager navigationManager)
    {
        _jsRuntime = jsRuntime;
        _navigationManager = navigationManager;
    }

    public async Task CommonJumpTip(string targetUrl)
    {
        await _jsRuntime.InvokeVoidAsync("alert", $"即将跳转至{targetUrl}");
        _navigationManager.NavigateTo(targetUrl);
    }
}
  1. 在项目Program.cs中注册该公共类到DI容器,根据需求选生命周期:
  • AddTransient:每次调用都生成新实例,适合轻量无状态的工具类
  • AddScoped:同一会话/电路范围内共用一个实例,绝大多数通用场景选这个
  • AddSingleton:整个应用生命周期全局唯一实例,Blazor Server场景下注意不要存储用户专属状态,会被所有用户共享
// 写在var app = builder.Build(); 之前
builder.Services.AddScoped<CommonService>();
  1. 在任意razor.cs分部类中通过[Inject]特性注入实例,直接调用方法即可
public partial class TestPage
{
    // 框架自动赋值,无需手动初始化
    [Inject]
    private CommonService CommonHelper { get; set; } = default!;

    private async Task HandleClick()
    {
        // 直接调用方法
        await CommonHelper.CommonJumpTip("/index");
    }
}

注意:不推荐手动new带依赖的公共类,你需要手动传入所有依赖的服务实例,后续新增依赖还要修改所有new的位置,维护成本极高,不符合Blazor的设计规范。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 06:01:01