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

如何在C# Razor Pages间共享自定义OnGetResources处理方法?

在Razor Pages中共享自定义OnGet处理方法的几种方案

针对你需要在多个Razor Pages中复用OnGetResources方法的需求,以下是几种实用的实现方式:

1. 抽象基类方案(推荐)

创建包含共享方法的抽象基类,让需要该逻辑的页面模型继承这个基类,实现一次编写多页面复用:

步骤1:定义抽象基类

public abstract class ResourceBasePageModel : PageModel
{
    protected readonly YourDbContext _dbContext;

    // 通过构造函数注入DbContext
    public ResourceBasePageModel(YourDbContext dbContext)
    {
        _dbContext = dbContext;
    }

    // 共享的OnGetResources方法
    public async Task<JsonResult> OnGetResources(int id)
    {
        var resourceData = await _dbContext.MyResource
            .Where(x => x.OtherResource.Id == id)
            .ToListAsync();
        
        return new JsonResult(new { data = resourceData });
    }
}

步骤2:页面模型继承基类

在需要使用该方法的页面模型中,继承上述基类并传递依赖:

public class ProductPageModel : ResourceBasePageModel
{
    public ProductPageModel(YourDbContext dbContext) : base(dbContext)
    {
    }

    // 页面自身的OnGet或其他自定义逻辑
    public async Task OnGet()
    {
        // ... 页面专属逻辑
    }
}

优势:统一管理共享逻辑,修改只需调整基类;完全避免代码重复。
注意:C#是单继承语言,若页面已继承其他基类则无法使用此方案。

2. 服务封装方案

将资源查询逻辑封装为独立服务,在页面模型中注入服务并调用,实现逻辑与页面解耦:

步骤1:创建资源服务

// 定义服务接口
public interface IResourceService
{
    Task<List<MyResource>> GetResourcesByRelatedId(int relatedId);
}

// 实现服务逻辑
public class ResourceService : IResourceService
{
    private readonly YourDbContext _dbContext;

    public ResourceService(YourDbContext dbContext)
    {
        _dbContext = dbContext;
    }

    public async Task<List<MyResource>> GetResourcesByRelatedId(int relatedId)
    {
        return await _dbContext.MyResource
            .Where(x => x.OtherResource.Id == relatedId)
            .ToListAsync();
    }
}

步骤2:注册服务

在Program.cs中注册服务:

builder.Services.AddScoped<IResourceService, ResourceService>();

步骤3:页面模型中使用服务

public class OrderPageModel : PageModel
{
    private readonly IResourceService _resourceService;

    public OrderPageModel(IResourceService resourceService)
    {
        _resourceService = resourceService;
    }

    // 页面的OnGetResources方法,内部调用服务
    public async Task<JsonResult> OnGetResources(int id)
    {
        var data = await _resourceService.GetResourcesByRelatedId(id);
        return new JsonResult(new { data });
    }

    // 页面其他逻辑
    public async Task OnGet()
    {
        // ...
    }
}

优势:逻辑与页面完全解耦,服务可被其他组件复用;支持页面根据需求微调OnGetResources的返回格式。

3. Partial Class(分部类)方案

若页面不需要继承基类,可将共享方法放在同名分部类中,让编译器自动合并类定义:

步骤1:创建分部类存放共享方法

比如针对Index.cshtml.cs的页面模型,创建一个同名分部类:

public partial class IndexModel : PageModel
{
    private readonly YourDbContext _dbContext;

    public IndexModel(YourDbContext dbContext)
    {
        _dbContext = dbContext;
    }

    public async Task<JsonResult> OnGetResources(int id)
    {
        var data = await _dbContext.MyResource
            .Where(x => x.OtherResource.Id == id)
            .ToListAsync();
        
        return new JsonResult(new { data });
    }
}

步骤2:页面自身的分部类

public partial class IndexModel : PageModel
{
    // 页面专属逻辑
    public async Task OnGet()
    {
        // ...
    }
}

优势:无需修改继承关系,灵活适配单个页面;
注意:每个需要的页面都要创建对应分部类,适合少量页面复用的场景。


内容的提问来源于stack exchange,提问作者yyy-t

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 03:33:34